1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott/*
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *******************************************************************************
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (C) 1997-2008, International Business Machines Corporation and    *
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * others. All Rights Reserved.                                                *
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *******************************************************************************
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * File DATEFMT.CPP
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Modification History:
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   Date        Name        Description
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   02/19/97    aliu        Converted from java.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   03/31/97    aliu        Modified extensively to work with 50 locales.
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   04/01/97    aliu        Added support for centuries.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   08/12/97    aliu        Fixed operator== to use Calendar::equivalentTo.
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *   07/20/98    stephen     Changed ParsePosition initialization
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ********************************************************************************
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/utypes.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !UCONFIG_NO_FORMATTING
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/ures.h"
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/datefmt.h"
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/smpdtfmt.h"
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "unicode/dtptngen.h"
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "reldtfmt.h"
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "cstring.h"
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "windtfmt.h"
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL)
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdio.h>
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *****************************************************************************
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// class DateFormat
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// *****************************************************************************
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottU_NAMESPACE_BEGIN
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::DateFormat()
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott:   fCalendar(0),
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fNumberFormat(0)
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::DateFormat(const DateFormat& other)
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott:   Format(other),
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fCalendar(0),
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fNumberFormat(0)
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *this = other;
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat& DateFormat::operator=(const DateFormat& other)
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (this != &other)
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        delete fCalendar;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        delete fNumberFormat;
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(other.fCalendar) {
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          fCalendar = other.fCalendar->clone();
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        } else {
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          fCalendar = NULL;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(other.fNumberFormat) {
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          fNumberFormat = (NumberFormat*)other.fNumberFormat->clone();
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        } else {
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          fNumberFormat = NULL;
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::~DateFormat()
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete fCalendar;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete fNumberFormat;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUBool
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::operator==(const Format& other) const
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // This protected comparison operator should only be called by subclasses
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // which have confirmed that the other object being compared against is
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // an instance of a sublcass of DateFormat.  THIS IS IMPORTANT.
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Format::operator== guarantees that this cast is safe
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    DateFormat* fmt = (DateFormat*)&other;
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return (this == fmt) ||
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        (Format::operator==(other) &&
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         fCalendar&&(fCalendar->isEquivalentTo(*fmt->fCalendar)) &&
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         (fNumberFormat && *fNumberFormat == *fmt->fNumberFormat));
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnicodeString&
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::format(const Formattable& obj,
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   UnicodeString& appendTo,
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   FieldPosition& fieldPosition,
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                   UErrorCode& status) const
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(status)) return appendTo;
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // if the type of the Formattable is double or long, treat it as if it were a Date
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UDate date = 0;
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    switch (obj.getType())
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    case Formattable::kDate:
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        date = obj.getDate();
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    case Formattable::kDouble:
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        date = (UDate)obj.getDouble();
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    case Formattable::kLong:
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        date = (UDate)obj.getLong();
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        break;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    default:
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        status = U_ILLEGAL_ARGUMENT_ERROR;
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return appendTo;
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Is this right?
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //if (fieldPosition.getBeginIndex() == fieldPosition.getEndIndex())
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //  status = U_ILLEGAL_ARGUMENT_ERROR;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return format(date, appendTo, fieldPosition);
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnicodeString&
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::format(UDate date, UnicodeString& appendTo, FieldPosition& fieldPosition) const {
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        // Use our calendar instance
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        UErrorCode ec = U_ZERO_ERROR;
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->setTime(date, ec);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_SUCCESS(ec)) {
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return format(*fCalendar, appendTo, fieldPosition);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return appendTo;
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUnicodeString&
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::format(UDate date, UnicodeString& appendTo) const
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Note that any error information is just lost.  That's okay
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // for this convenience method.
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    FieldPosition fpos(0);
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return format(date, appendTo, fpos);
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUDate
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::parse(const UnicodeString& text,
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                  ParsePosition& pos) const
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UDate d = 0; // Error return UDate is 0 (the epoch)
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int32_t start = pos.getIndex();
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        // Parse may update TimeZone used by the calendar.
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        TimeZone *tzsav = (TimeZone*)fCalendar->getTimeZone().clone();
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->clear();
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        parse(text, *fCalendar, pos);
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (pos.getIndex() != start) {
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            UErrorCode ec = U_ZERO_ERROR;
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            d = fCalendar->getTime(ec);
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (U_FAILURE(ec)) {
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                // We arrive here if fCalendar is non-lenient and there
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                // is an out-of-range field.  We don't know which field
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                // was illegal so we set the error index to the start.
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                pos.setIndex(start);
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                pos.setErrorIndex(start);
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                d = 0;
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        // Restore TimeZone
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->adoptTimeZone(tzsav);
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return d;
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUDate
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::parse(const UnicodeString& text,
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                  UErrorCode& status) const
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_FAILURE(status)) return 0;
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ParsePosition pos(0);
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UDate result = parse(text, pos);
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (pos.getIndex() == 0) {
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined (U_DEBUG_CAL)
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      fprintf(stderr, "%s:%d - - failed to parse  - err index %d\n"
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              , __FILE__, __LINE__, pos.getErrorIndex() );
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      status = U_ILLEGAL_ARGUMENT_ERROR;
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return result;
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::parseObject(const UnicodeString& source,
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        Formattable& result,
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        ParsePosition& pos) const
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    result.setDate(parse(source, pos));
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat* U_EXPORT2
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::createTimeInstance(DateFormat::EStyle style,
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               const Locale& aLocale)
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return create(style, kNone, aLocale);
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat* U_EXPORT2
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::createDateInstance(DateFormat::EStyle style,
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               const Locale& aLocale)
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // +4 to set the correct index for getting data out of
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // LocaleElements.
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(style != kNone)
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        style = (EStyle) (style + kDateOffset);
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return create(kNone, (EStyle) (style), aLocale);
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat* U_EXPORT2
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::createDateTimeInstance(EStyle dateStyle,
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                   EStyle timeStyle,
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                   const Locale& aLocale)
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(dateStyle != kNone)
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        dateStyle = (EStyle) (dateStyle + kDateOffset);
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return create(timeStyle, dateStyle, aLocale);
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat* U_EXPORT2
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::createInstance()
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return create(kShort, (EStyle) (kShort + kDateOffset), Locale::getDefault());
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat* U_EXPORT2
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale)
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    UErrorCode status = U_ZERO_ERROR;
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef U_WINDOWS
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    char buffer[8];
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), status);
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // if the locale has "@compat=host", create a host-specific DateFormat...
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (count > 0 && uprv_strcmp(buffer, "host") == 0) {
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Win32DateFormat *f = new Win32DateFormat(timeStyle, dateStyle, locale, status);
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (U_SUCCESS(status)) {
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return f;
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        delete f;
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // is it relative?
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if(/*((timeStyle!=UDAT_NONE)&&(timeStyle & UDAT_RELATIVE)) || */((dateStyle!=kNone)&&((dateStyle-kDateOffset) & UDAT_RELATIVE))) {
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        RelativeDateFormat *r = new RelativeDateFormat((UDateFormatStyle)timeStyle, (UDateFormatStyle)(dateStyle-kDateOffset), locale, status);
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(U_SUCCESS(status)) return r;
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        delete r;
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        status = U_ZERO_ERROR;
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Try to create a SimpleDateFormat of the desired style.
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SimpleDateFormat *f = new SimpleDateFormat(timeStyle, dateStyle, locale, status);
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_SUCCESS(status)) return f;
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete f;
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // If that fails, try to create a format using the default pattern and
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // the DateFormatSymbols for this locale.
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    status = U_ZERO_ERROR;
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    f = new SimpleDateFormat(locale, status);
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (U_SUCCESS(status)) return f;
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete f;
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // This should never really happen, because the preceding constructor
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // should always succeed.  If the resource data is unavailable, a last
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // resort object should be returned.
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst Locale* U_EXPORT2
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::getAvailableLocales(int32_t& count)
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Get the list of installed locales.
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Even if root has the correct date format for this locale,
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // it's still a valid locale (we don't worry about data fallbacks).
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Locale::getAvailableLocales(count);
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::adoptCalendar(Calendar* newCalendar)
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete fCalendar;
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fCalendar = newCalendar;
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::setCalendar(const Calendar& newCalendar)
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Calendar* newCalClone = newCalendar.clone();
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (newCalClone != NULL) {
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        adoptCalendar(newCalClone);
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst Calendar*
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::getCalendar() const
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return fCalendar;
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::adoptNumberFormat(NumberFormat* newNumberFormat)
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delete fNumberFormat;
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fNumberFormat = newNumberFormat;
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    newNumberFormat->setParseIntegerOnly(TRUE);
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::setNumberFormat(const NumberFormat& newNumberFormat)
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NumberFormat* newNumFmtClone = (NumberFormat*)newNumberFormat.clone();
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (newNumFmtClone != NULL) {
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        adoptNumberFormat(newNumFmtClone);
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst NumberFormat*
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::getNumberFormat() const
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return fNumberFormat;
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::adoptTimeZone(TimeZone* zone)
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->adoptTimeZone(zone);
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::setTimeZone(const TimeZone& zone)
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->setTimeZone(zone);
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst TimeZone&
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::getTimeZone() const
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return fCalendar->getTimeZone();
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // If calendar doesn't exists, create default timezone.
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // fCalendar is rarely null
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *(TimeZone::createDefault());
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::setLenient(UBool lenient)
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        fCalendar->setLenient(lenient);
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//----------------------------------------------------------------------
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottUBool
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottDateFormat::isLenient() const
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott{
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (fCalendar != NULL) {
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return fCalendar->isLenient();
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // fCalendar is rarely null
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return FALSE;
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottU_NAMESPACE_END
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif /* #if !UCONFIG_NO_FORMATTING */
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//eof
451