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