164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Copyright (C) 1997-2015, International Business Machines Corporation and    *
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.                                                *
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * File DATEFMT.CPP
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Modification History:
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Date        Name        Description
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   02/19/97    aliu        Converted from java.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   03/31/97    aliu        Modified extensively to work with 50 locales.
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   04/01/97    aliu        Added support for centuries.
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   08/12/97    aliu        Fixed operator== to use Calendar::equivalentTo.
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   07/20/98    stephen     Changed ParsePosition initialization
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************************
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/datefmt.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
29c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/dtptngen.h"
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/udisplaycontext.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "reldtfmt.h"
32c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "sharedobject.h"
33c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unifiedcache.h"
34c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "uarrsort.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "windtfmt.h"
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL)
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class DateFormat
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API DateFmtBestPattern : public SharedObject {
50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic:
51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString fPattern;
52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DateFmtBestPattern(const UnicodeString &pattern)
54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            : fPattern(pattern) { }
55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    ~DateFmtBestPattern();
56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertDateFmtBestPattern::~DateFmtBestPattern() {
59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Rouberttemplate<> U_I18N_API
62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertconst DateFmtBestPattern *LocaleCacheKey<DateFmtBestPattern>::createObject(
63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const void * /*creationContext*/, UErrorCode &status) const {
64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    status = U_UNSUPPORTED_ERROR;
65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return NULL;
66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API DateFmtBestPatternKey : public LocaleCacheKey<DateFmtBestPattern> {
69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprivate:
70c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString fSkeleton;
71c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic:
72c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DateFmtBestPatternKey(
73c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const Locale &loc,
74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UnicodeString &skeleton,
75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status)
76c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            : LocaleCacheKey<DateFmtBestPattern>(loc),
77c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert              fSkeleton(DateTimePatternGenerator::staticGetSkeleton(skeleton, status)) { }
78c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DateFmtBestPatternKey(const DateFmtBestPatternKey &other) :
79c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            LocaleCacheKey<DateFmtBestPattern>(other),
80c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            fSkeleton(other.fSkeleton) { }
81c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual ~DateFmtBestPatternKey();
82c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual int32_t hashCode() const {
83c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return 37 * LocaleCacheKey<DateFmtBestPattern>::hashCode() + fSkeleton.hashCode();
84c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
85c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual UBool operator==(const CacheKeyBase &other) const {
86c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       // reflexive
87c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       if (this == &other) {
88c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert           return TRUE;
89c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       }
90c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       if (!LocaleCacheKey<DateFmtBestPattern>::operator==(other)) {
91c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert           return FALSE;
92c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       }
93c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       // We know that this and other are of same class if we get this far.
94c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       const DateFmtBestPatternKey &realOther =
95c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert               static_cast<const DateFmtBestPatternKey &>(other);
96c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert       return (realOther.fSkeleton == fSkeleton);
97c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
98c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual CacheKeyBase *clone() const {
99c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return new DateFmtBestPatternKey(*this);
100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
101c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    virtual const DateFmtBestPattern *createObject(
102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            const void * /*unused*/, UErrorCode &status) const {
103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        LocalPointer<DateTimePatternGenerator> dtpg(
104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                    DateTimePatternGenerator::createInstance(fLoc, status));
105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return NULL;
107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        LocalPointer<DateFmtBestPattern> pattern(
110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                new DateFmtBestPattern(
111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                        dtpg->getBestPattern(fSkeleton, status)),
112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                status);
113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        if (U_FAILURE(status)) {
114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            return NULL;
115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        }
116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        DateFmtBestPattern *result = pattern.orphan();
117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        result->addRef();
118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return result;
119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert};
121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertDateFmtBestPatternKey::~DateFmtBestPatternKey() { }
123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::DateFormat()
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru:   fCalendar(0),
127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fNumberFormat(0),
128fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::DateFormat(const DateFormat& other)
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru:   Format(other),
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fCalendar(0),
137fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fNumberFormat(0),
138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *this = other;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat& DateFormat::operator=(const DateFormat& other)
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this != &other)
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fCalendar;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fNumberFormat;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(other.fCalendar) {
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fCalendar = other.fCalendar->clone();
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fCalendar = NULL;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(other.fNumberFormat) {
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fNumberFormat = (NumberFormat*)other.fNumberFormat->clone();
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fNumberFormat = NULL;
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
16159d709d503bab6e2b61931737e662dd293b40578ccornelius        fBoolFlags = other.fBoolFlags;
162fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        fCapitalizationContext = other.fCapitalizationContext;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *this;
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::~DateFormat()
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fCalendar;
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fNumberFormat;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::operator==(const Format& other) const
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This protected comparison operator should only be called by subclasses
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // which have confirmed that the other object being compared against is
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // an instance of a sublcass of DateFormat.  THIS IS IMPORTANT.
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Format::operator== guarantees that this cast is safe
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat* fmt = (DateFormat*)&other;
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (this == fmt) ||
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (Format::operator==(other) &&
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         fCalendar&&(fCalendar->isEquivalentTo(*fmt->fCalendar)) &&
190fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius         (fNumberFormat && *fNumberFormat == *fmt->fNumberFormat) &&
191fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius         (fCapitalizationContext == fmt->fCapitalizationContext) );
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::format(const Formattable& obj,
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UnicodeString& appendTo,
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   FieldPosition& fieldPosition,
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UErrorCode& status) const
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) return appendTo;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // if the type of the Formattable is double or long, treat it as if it were a Date
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate date = 0;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (obj.getType())
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDate:
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        date = obj.getDate();
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        date = (UDate)obj.getDouble();
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        date = (UDate)obj.getLong();
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ILLEGAL_ARGUMENT_ERROR;
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return appendTo;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Is this right?
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (fieldPosition.getBeginIndex() == fieldPosition.getEndIndex())
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  status = U_ILLEGAL_ARGUMENT_ERROR;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return format(date, appendTo, fieldPosition);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDateFormat::format(const Formattable& obj,
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString& appendTo,
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   FieldPositionIterator* posIter,
23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UErrorCode& status) const
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) return appendTo;
23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // if the type of the Formattable is double or long, treat it as if it were a Date
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UDate date = 0;
24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    switch (obj.getType())
24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    case Formattable::kDate:
24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        date = obj.getDate();
24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        break;
24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    case Formattable::kDouble:
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        date = (UDate)obj.getDouble();
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        break;
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    case Formattable::kLong:
25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        date = (UDate)obj.getLong();
25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        break;
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    default:
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ILLEGAL_ARGUMENT_ERROR;
25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return appendTo;
25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Is this right?
25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //if (fieldPosition.getBeginIndex() == fieldPosition.getEndIndex())
25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //  status = U_ILLEGAL_ARGUMENT_ERROR;
26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return format(date, appendTo, posIter, status);
26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//----------------------------------------------------------------------
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Default implementation for backwards compatibility, subclasses should implement.
26750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDateFormat::format(Calendar& /* unused cal */,
26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UnicodeString& appendTo,
27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   FieldPositionIterator* /* unused posIter */,
27150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UErrorCode& status) const {
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_SUCCESS(status)) {
27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_UNSUPPORTED_ERROR;
27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return appendTo;
27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//----------------------------------------------------------------------
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::format(UDate date, UnicodeString& appendTo, FieldPosition& fieldPosition) const {
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fCalendar != NULL) {
28383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        // Use a clone of our calendar instance
28483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        Calendar* calClone = fCalendar->clone();
28583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (calClone != NULL) {
28683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            UErrorCode ec = U_ZERO_ERROR;
28783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            calClone->setTime(date, ec);
28883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            if (U_SUCCESS(ec)) {
28983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                format(*calClone, appendTo, fieldPosition);
29083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            }
29183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            delete calClone;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return appendTo;
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//----------------------------------------------------------------------
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString&
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDateFormat::format(UDate date, UnicodeString& appendTo, FieldPositionIterator* posIter,
30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                   UErrorCode& status) const {
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (fCalendar != NULL) {
30383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        Calendar* calClone = fCalendar->clone();
30483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (calClone != NULL) {
30583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            calClone->setTime(date, status);
30683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            if (U_SUCCESS(status)) {
30783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius               format(*calClone, appendTo, posIter, status);
30883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            }
30983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            delete calClone;
31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return appendTo;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::format(UDate date, UnicodeString& appendTo) const
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Note that any error information is just lost.  That's okay
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // for this convenience method.
32264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    FieldPosition fpos(FieldPosition::DONT_CARE);
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return format(date, appendTo, fpos);
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::parse(const UnicodeString& text,
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ParsePosition& pos) const
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = 0; // Error return UDate is 0 (the epoch)
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fCalendar != NULL) {
33483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        Calendar* calClone = fCalendar->clone();
33583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (calClone != NULL) {
33683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            int32_t start = pos.getIndex();
33783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            calClone->clear();
33883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            parse(text, *calClone, pos);
33983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            if (pos.getIndex() != start) {
34083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                UErrorCode ec = U_ZERO_ERROR;
34183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                d = calClone->getTime(ec);
34283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                if (U_FAILURE(ec)) {
34383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    // We arrive here if fCalendar => calClone is non-lenient and
34483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    // there is an out-of-range field.  We don't know which field
34583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    // was illegal so we set the error index to the start.
34683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    pos.setIndex(start);
34783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    pos.setErrorIndex(start);
34883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                    d = 0;
34983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                }
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
35183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            delete calClone;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return d;
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::parse(const UnicodeString& text,
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UErrorCode& status) const
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) return 0;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos(0);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate result = parse(text, pos);
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos.getIndex() == 0) {
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_DEBUG_CAL)
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      fprintf(stderr, "%s:%d - - failed to parse  - err index %d\n"
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              , __FILE__, __LINE__, pos.getErrorIndex() );
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      status = U_ILLEGAL_ARGUMENT_ERROR;
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::parseObject(const UnicodeString& source,
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        Formattable& result,
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        ParsePosition& pos) const
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result.setDate(parse(source, pos));
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat* U_EXPORT2
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::createTimeInstance(DateFormat::EStyle style,
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               const Locale& aLocale)
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
3931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    return createDateTimeInstance(kNone, style, aLocale);
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat* U_EXPORT2
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::createDateInstance(DateFormat::EStyle style,
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               const Locale& aLocale)
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    return createDateTimeInstance(style, kNone, aLocale);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat* U_EXPORT2
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::createDateTimeInstance(EStyle dateStyle,
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   EStyle timeStyle,
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   const Locale& aLocale)
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert   if(dateStyle != kNone)
4131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert   {
4141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert       dateStyle = (EStyle) (dateStyle + kDateOffset);
4151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert   }
4161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert   return create(timeStyle, dateStyle, aLocale);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat* U_EXPORT2
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::createInstance()
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
4241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    return createDateTimeInstance(kShort, kShort, Locale::getDefault());
4251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
4261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
4271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//----------------------------------------------------------------------
4281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
429c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUnicodeString U_EXPORT2
430c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertDateFormat::getBestPattern(
431c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const Locale &locale,
432c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        const UnicodeString &skeleton,
433c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        UErrorCode &status) {
434c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnifiedCache *cache = UnifiedCache::getInstance(status);
435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
436c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return UnicodeString();
437c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
438c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    DateFmtBestPatternKey key(locale, skeleton, status);
439c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    const DateFmtBestPattern *patternPtr = NULL;
440c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    cache->get(key, patternPtr, status);
441c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (U_FAILURE(status)) {
442c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return UnicodeString();
443c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
444c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    UnicodeString result(patternPtr->fPattern);
445c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    patternPtr->removeRef();
446c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return result;
447c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
448c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
4491b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat* U_EXPORT2
4501b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat::createInstanceForSkeleton(
4511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        Calendar *calendarToAdopt,
4521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString& skeleton,
4531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const Locale &locale,
4541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode &status) {
4551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    LocalPointer<Calendar> calendar(calendarToAdopt);
4561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (U_FAILURE(status)) {
4571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return NULL;
4581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
4591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (calendar.isNull()) {
4601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        status = U_ILLEGAL_ARGUMENT_ERROR;
4611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return NULL;
4621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
4631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    DateFormat *result = createInstanceForSkeleton(skeleton, locale, status);
4641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (U_FAILURE(status)) {
4651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return NULL;
4661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
4671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    result->adoptCalendar(calendar.orphan());
4681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    return result;
4691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
4701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
4711b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat* U_EXPORT2
4721b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat::createInstanceForSkeleton(
4731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString& skeleton,
4741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const Locale &locale,
4751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode &status) {
4761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    if (U_FAILURE(status)) {
4771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        return NULL;
4781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
479c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    LocalPointer<DateFormat> df(
480c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        new SimpleDateFormat(
481c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            getBestPattern(locale, skeleton, status),
482c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert            locale, status),
483c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        status);
484c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return U_SUCCESS(status) ? df.orphan() : NULL;
4851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
4861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
4871b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat* U_EXPORT2
4881b7d32f919554dda9c193b32188251337bc756f1Fredrik RoubertDateFormat::createInstanceForSkeleton(
4891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        const UnicodeString& skeleton,
4901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        UErrorCode &status) {
4911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    return createInstanceForSkeleton(
4921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            skeleton, Locale::getDefault(), status);
4931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert}
4941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat* U_EXPORT2
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale)
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
50183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_PLATFORM_HAS_WIN32_API
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[8];
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), status);
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // if the locale has "@compat=host", create a host-specific DateFormat...
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (count > 0 && uprv_strcmp(buffer, "host") == 0) {
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Win32DateFormat *f = new Win32DateFormat(timeStyle, dateStyle, locale, status);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return f;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete f;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // is it relative?
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(/*((timeStyle!=UDAT_NONE)&&(timeStyle & UDAT_RELATIVE)) || */((dateStyle!=kNone)&&((dateStyle-kDateOffset) & UDAT_RELATIVE))) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RelativeDateFormat *r = new RelativeDateFormat((UDateFormatStyle)timeStyle, (UDateFormatStyle)(dateStyle-kDateOffset), locale, status);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) return r;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete r;
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Try to create a SimpleDateFormat of the desired style.
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *f = new SimpleDateFormat(timeStyle, dateStyle, locale, status);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) return f;
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete f;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // If that fails, try to create a format using the default pattern and
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // the DateFormatSymbols for this locale.
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f = new SimpleDateFormat(locale, status);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) return f;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete f;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This should never really happen, because the preceding constructor
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // should always succeed.  If the resource data is unavailable, a last
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // resort object should be returned.
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return 0;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Locale* U_EXPORT2
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::getAvailableLocales(int32_t& count)
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Get the list of installed locales.
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Even if root has the correct date format for this locale,
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // it's still a valid locale (we don't worry about data fallbacks).
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Locale::getAvailableLocales(count);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::adoptCalendar(Calendar* newCalendar)
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fCalendar;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fCalendar = newCalendar;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::setCalendar(const Calendar& newCalendar)
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Calendar* newCalClone = newCalendar.clone();
568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (newCalClone != NULL) {
569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        adoptCalendar(newCalClone);
570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Calendar*
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::getCalendar() const
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fCalendar;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::adoptNumberFormat(NumberFormat* newNumberFormat)
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fNumberFormat;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fNumberFormat = newNumberFormat;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newNumberFormat->setParseIntegerOnly(TRUE);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::setNumberFormat(const NumberFormat& newNumberFormat)
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    NumberFormat* newNumFmtClone = (NumberFormat*)newNumberFormat.clone();
596c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (newNumFmtClone != NULL) {
597c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        adoptNumberFormat(newNumFmtClone);
598c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst NumberFormat*
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::getNumberFormat() const
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fNumberFormat;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::adoptTimeZone(TimeZone* zone)
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fCalendar != NULL) {
615c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        fCalendar->adoptTimeZone(zone);
616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::setTimeZone(const TimeZone& zone)
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
623c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fCalendar != NULL) {
624c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        fCalendar->setTimeZone(zone);
625c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst TimeZone&
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::getTimeZone() const
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
633c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fCalendar != NULL) {
634c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return fCalendar->getTimeZone();
635c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
636c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // If calendar doesn't exists, create default timezone.
637c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // fCalendar is rarely null
638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return *(TimeZone::createDefault());
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::setLenient(UBool lenient)
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fCalendar != NULL) {
647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        fCalendar->setLenient(lenient);
648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
649fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
650fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, lenient, status);
651fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, lenient, status);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat::isLenient() const
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
659fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool lenient = TRUE;
660fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (fCalendar != NULL) {
661fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        lenient = fCalendar->isLenient();
662fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
663fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
664fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return lenient
665fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && getBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, status)
666fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && getBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, status);
667fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
668fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
669fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid
670fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDateFormat::setCalendarLenient(UBool lenient)
671fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
672fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (fCalendar != NULL) {
673fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        fCalendar->setLenient(lenient);
674fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
675fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
676fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
677fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius//----------------------------------------------------------------------
678fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
679fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUBool
680fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDateFormat::isCalendarLenient() const
681fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fCalendar != NULL) {
683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return fCalendar->isLenient();
684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // fCalendar is rarely null
686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return FALSE;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
69059d709d503bab6e2b61931737e662dd293b40578ccornelius//----------------------------------------------------------------------
69159d709d503bab6e2b61931737e662dd293b40578ccornelius
692fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
693fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid DateFormat::setContext(UDisplayContext value, UErrorCode& status)
694fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
695fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status))
696fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
697fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if ( (UDisplayContextType)((uint32_t)value >> 8) == UDISPCTX_TYPE_CAPITALIZATION ) {
698fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        fCapitalizationContext = value;
699fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
700fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        status = U_ILLEGAL_ARGUMENT_ERROR;
701fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius   }
702fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
703fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
704fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
705fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius//----------------------------------------------------------------------
706fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
707fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
708fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUDisplayContext DateFormat::getContext(UDisplayContextType type, UErrorCode& status) const
709fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
710fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status))
711fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (UDisplayContext)0;
712fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (type != UDISPCTX_TYPE_CAPITALIZATION) {
713fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        status = U_ILLEGAL_ARGUMENT_ERROR;
714fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (UDisplayContext)0;
715fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
716fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return fCapitalizationContext;
717fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
718fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
719fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
720fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius//----------------------------------------------------------------------
721fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
722fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
72359d709d503bab6e2b61931737e662dd293b40578ccorneliusDateFormat&
72459d709d503bab6e2b61931737e662dd293b40578ccorneliusDateFormat::setBooleanAttribute(UDateFormatBooleanAttribute attr,
72559d709d503bab6e2b61931737e662dd293b40578ccornelius    									UBool newValue,
72659d709d503bab6e2b61931737e662dd293b40578ccornelius    									UErrorCode &status) {
72759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(!fBoolFlags.isValidValue(newValue)) {
72859d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ILLEGAL_ARGUMENT_ERROR;
72959d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
73059d709d503bab6e2b61931737e662dd293b40578ccornelius        fBoolFlags.set(attr, newValue);
73159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
73259d709d503bab6e2b61931737e662dd293b40578ccornelius
73359d709d503bab6e2b61931737e662dd293b40578ccornelius    return *this;
73459d709d503bab6e2b61931737e662dd293b40578ccornelius}
73559d709d503bab6e2b61931737e662dd293b40578ccornelius
73659d709d503bab6e2b61931737e662dd293b40578ccornelius//----------------------------------------------------------------------
73759d709d503bab6e2b61931737e662dd293b40578ccornelius
73859d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool
73959d709d503bab6e2b61931737e662dd293b40578ccorneliusDateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/*status*/) const {
74059d709d503bab6e2b61931737e662dd293b40578ccornelius
74159d709d503bab6e2b61931737e662dd293b40578ccornelius    return fBoolFlags.get(attr);
74259d709d503bab6e2b61931737e662dd293b40578ccornelius}
74359d709d503bab6e2b61931737e662dd293b40578ccornelius
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
749