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