1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius*   Copyright (C) 1996-2013, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "utypeinfo.h"  // for 'typeid' to work
927f654740f2a26ad62a5c155af9199af9e69b889claireho
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucal.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/timezone.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/gregocal.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/strenum.h"
2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/localpointer.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrenum.h"
26b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "uenumimp.h"
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "ulist.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic TimeZone*
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_createTimeZone(const UChar* zoneID, int32_t len, UErrorCode* ec) {
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* zone = NULL;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec!=NULL && U_SUCCESS(*ec)) {
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Note that if zoneID is invalid, we get back GMT. This odd
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // behavior is by design and goes back to the JDK. The only
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // failure we will see is a memory allocation failure.
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t l = (len<0 ? u_strlen(zoneID) : len);
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString zoneStrID;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zoneStrID.setTo((UBool)(len < 0), zoneID, l); /* temporary read-only alias */
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zone = TimeZone::createTimeZone(zoneStrID);
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (zone == NULL) {
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *ec = U_MEMORY_ALLOCATION_ERROR;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return zone;
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoucal_openTimeZoneIDEnumeration(USystemTimeZoneType zoneType, const char* region,
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                const int32_t* rawOffset, UErrorCode* ec) {
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return uenum_openFromStringEnumeration(TimeZone::createTimeZoneIDEnumeration(
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        zoneType, region, rawOffset, *ec), ec);
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CAPI UEnumeration* U_EXPORT2
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_openTimeZones(UErrorCode* ec) {
58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return uenum_openFromStringEnumeration(TimeZone::createEnumeration(), ec);
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_openCountryTimeZones(const char* country, UErrorCode* ec) {
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return uenum_openFromStringEnumeration(TimeZone::createEnumeration(country), ec);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec) {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = 0;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ec!=NULL && U_SUCCESS(*ec)) {
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone* zone = TimeZone::createDefault();
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (zone == NULL) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *ec = U_MEMORY_ALLOCATION_ERROR;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString id;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->getID(id);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete zone;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            len = id.extract(result, resultCapacity, *ec);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return len;
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec) {
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* zone = _createTimeZone(zoneID, -1, ec);
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone != NULL) {
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone::adoptDefault(zone);
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t result = 0;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* zone = _createTimeZone(zoneID, -1, ec);
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(*ec)) {
9627f654740f2a26ad62a5c155af9199af9e69b889claireho        SimpleTimeZone* stz = dynamic_cast<SimpleTimeZone*>(zone);
9727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (stz != NULL) {
9827f654740f2a26ad62a5c155af9199af9e69b889claireho            result = stz->getDSTSavings();
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Since there is no getDSTSavings on TimeZone, we use a
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // heuristic: Starting with the current time, march
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // forwards for one year, looking for DST savings.
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Stepping by weeks is sufficient.
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UDate d = Calendar::getNow();
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int32_t i=0; i<53; ++i, d+=U_MILLIS_PER_DAY*7.0) {
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t raw, dst;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                zone->getOffset(d, FALSE, raw, dst, *ec);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(*ec)) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else if (dst != 0) {
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    result = dst;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate  U_EXPORT2
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getNow()
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return Calendar::getNow();
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY)
129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCalendar*  U_EXPORT2
131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_open(  const UChar*  zoneID,
132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            int32_t       len,
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            const char*   locale,
134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UCalendarType caltype,
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode*   status)
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(*status)) return 0;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault()
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      : _createTimeZone(zoneID, len, status);
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (U_FAILURE(*status)) {
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return NULL;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  if ( caltype == UCAL_GREGORIAN ) {
148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      char  localeBuf[ULOC_LOCALE_IDENTIFIER_CAPACITY];
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      if ( locale == NULL ) {
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          locale = uloc_getDefault();
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      uprv_strncpy(localeBuf, locale, ULOC_LOCALE_IDENTIFIER_CAPACITY);
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      uloc_setKeywordValue("calendar", "gregorian", localeBuf, ULOC_LOCALE_IDENTIFIER_CAPACITY, status);
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      if (U_FAILURE(*status)) {
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          return NULL;
156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      }
157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      return (UCalendar*)Calendar::createInstance(zone, Locale(localeBuf), *status);
158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return (UCalendar*)Calendar::createInstance(zone, Locale(locale), *status);
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_close(UCalendar *cal)
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete (Calendar*) cal;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CAPI UCalendar* U_EXPORT2
170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruucal_clone(const UCalendar* cal,
171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru           UErrorCode*      status)
172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  if(U_FAILURE(*status)) return 0;
174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  Calendar* res = ((Calendar*)cal)->clone();
176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  if(res == 0) {
178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    *status = U_MEMORY_ALLOCATION_ERROR;
179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return 0;
180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }
181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  return (UCalendar*) res;
183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setTimeZone(    UCalendar*      cal,
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const    UChar*            zoneID,
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t        len,
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode *status)
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(*status))
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TimeZone* zone = (zoneID==NULL) ? TimeZone::createDefault()
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      : _createTimeZone(zoneID, len, status);
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (zone != NULL) {
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ((Calendar*)cal)->adoptTimeZone(zone);
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
2048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusucal_getTimeZoneID(const UCalendar *cal,
2058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                   UChar *result,
2068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                   int32_t resultLength,
2078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                   UErrorCode *status)
2088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
2098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (U_FAILURE(*status)) {
2108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return 0;
2118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
2128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
2138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UnicodeString id;
2148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    tz.getID(id);
2158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    return id.extract(result, resultLength, *status);
2168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
2178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
2188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_CAPI int32_t U_EXPORT2
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getTimeZoneDisplayName(const     UCalendar*                 cal,
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UCalendarDisplayNameType     type,
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const char             *locale,
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UChar*                  result,
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    int32_t                 resultLength,
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode*             status)
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return -1;
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString id;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        id.setTo(result, 0, resultLength);
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(type) {
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_STANDARD:
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      tz.getDisplayName(FALSE, TimeZone::LONG, Locale(locale), id);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_SHORT_STANDARD:
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      tz.getDisplayName(FALSE, TimeZone::SHORT, Locale(locale), id);
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_DST:
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      tz.getDisplayName(TRUE, TimeZone::LONG, Locale(locale), id);
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_SHORT_DST:
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      tz.getDisplayName(TRUE, TimeZone::SHORT, Locale(locale), id);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return id.extract(result, resultLength, *status);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool  U_EXPORT2
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_inDaylightTime(    const    UCalendar*      cal,
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode*     status )
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return (UBool) -1;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal)->inDaylightTime(*status);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setGregorianChange(UCalendar *cal, UDate date, UErrorCode *pErrorCode) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cpp_cal = (Calendar *)cal;
27327f654740f2a26ad62a5c155af9199af9e69b889claireho    GregorianCalendar *gregocal = dynamic_cast<GregorianCalendar *>(cpp_cal);
27427f654740f2a26ad62a5c155af9199af9e69b889claireho    // Not if(gregocal == NULL) {
27527f654740f2a26ad62a5c155af9199af9e69b889claireho    // because we really want to work only with a GregorianCalendar, not with
27627f654740f2a26ad62a5c155af9199af9e69b889claireho    // its subclasses like BuddhistCalendar.
277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (cpp_cal == NULL) {
278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // We normally don't check "this" pointers for NULL, but this here avoids
279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // compiler-generated exception-throwing code in case cal == NULL.
280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
28327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(typeid(*cpp_cal) != typeid(GregorianCalendar)) {
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode = U_UNSUPPORTED_ERROR;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
28727f654740f2a26ad62a5c155af9199af9e69b889claireho    gregocal->setGregorianChange(date, *pErrorCode);
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate U_EXPORT2
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getGregorianChange(const UCalendar *cal, UErrorCode *pErrorCode) {
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode)) {
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UDate)0;
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
29527f654740f2a26ad62a5c155af9199af9e69b889claireho    const Calendar *cpp_cal = (const Calendar *)cal;
29627f654740f2a26ad62a5c155af9199af9e69b889claireho    const GregorianCalendar *gregocal = dynamic_cast<const GregorianCalendar *>(cpp_cal);
29727f654740f2a26ad62a5c155af9199af9e69b889claireho    // Not if(gregocal == NULL) {
29827f654740f2a26ad62a5c155af9199af9e69b889claireho    // see comments in ucal_setGregorianChange().
299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (cpp_cal == NULL) {
300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // We normally don't check "this" pointers for NULL, but this here avoids
301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // compiler-generated exception-throwing code in case cal == NULL.
302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return (UDate)0;
304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
30527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(typeid(*cpp_cal) != typeid(GregorianCalendar)) {
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode = U_UNSUPPORTED_ERROR;
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UDate)0;
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
30927f654740f2a26ad62a5c155af9199af9e69b889claireho    return gregocal->getGregorianChange();
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getAttribute(    const    UCalendar*              cal,
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UCalendarAttribute      attr)
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(attr) {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_LENIENT:
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->isLenient();
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_FIRST_DAY_OF_WEEK:
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getFirstDayOfWeek();
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_MINIMAL_DAYS_IN_FIRST_WEEK:
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getMinimalDaysInFirstWeek();
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  case UCAL_REPEATED_WALL_TIME:
328103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      return ((Calendar*)cal)->getRepeatedWallTimeOption();
329103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
330103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  case UCAL_SKIPPED_WALL_TIME:
331103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      return ((Calendar*)cal)->getSkippedWallTimeOption();
332103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  default:
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -1;
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setAttribute(      UCalendar*              cal,
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UCalendarAttribute      attr,
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  int32_t                 newValue)
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(attr) {
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_LENIENT:
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ((Calendar*)cal)->setLenient((UBool)newValue);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_FIRST_DAY_OF_WEEK:
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ((Calendar*)cal)->setFirstDayOfWeek((UCalendarDaysOfWeek)newValue);
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_MINIMAL_DAYS_IN_FIRST_WEEK:
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ((Calendar*)cal)->setMinimalDaysInFirstWeek((uint8_t)newValue);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
357103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
358103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  case UCAL_REPEATED_WALL_TIME:
359103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      ((Calendar*)cal)->setRepeatedWallTimeOption((UCalendarWallTimeOption)newValue);
360103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      break;
361103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  case UCAL_SKIPPED_WALL_TIME:
363103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      ((Calendar*)cal)->setSkippedWallTimeOption((UCalendarWallTimeOption)newValue);
364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      break;
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getAvailable(int32_t index)
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_getAvailable(index);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_countAvailable()
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_countAvailable();
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UDate  U_EXPORT2
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getMillis(    const    UCalendar*      cal,
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode*     status)
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return (UDate) 0;
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal)->getTime(*status);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setMillis(        UCalendar*      cal,
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UDate           dateTime,
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode*     status )
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return;
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->setTime(dateTime, *status);
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TBD: why does this take an UErrorCode?
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDate(        UCalendar*        cal,
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             int32_t            year,
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             int32_t            month,
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             int32_t            date,
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UErrorCode        *status)
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->set(year, month, date);
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TBD: why does this take an UErrorCode?
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_setDateTime(    UCalendar*        cal,
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            year,
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            month,
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            date,
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            hour,
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            minute,
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 int32_t            second,
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UErrorCode        *status)
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return;
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->set(year, month, date, hour, minute, second);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool  U_EXPORT2
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_equivalentTo(    const UCalendar*      cal1,
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const UCalendar*      cal2)
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal1)->isEquivalentTo(*((Calendar*)cal2));
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_add(    UCalendar*                cal,
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UCalendarDateFields        field,
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t                    amount,
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UErrorCode*                status)
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return;
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->add(field, amount, *status);
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_roll(        UCalendar*            cal,
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCalendarDateFields field,
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t                amount,
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode*            status)
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->roll(field, amount, *status);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t  U_EXPORT2
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_get(    const    UCalendar*                cal,
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UCalendarDateFields        field,
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UErrorCode*                status )
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status)) return -1;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal)->get(field, *status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_set(    UCalendar*                cal,
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UCalendarDateFields        field,
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t                    value)
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->set(field, value);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool  U_EXPORT2
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_isSet(    const    UCalendar*                cal,
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           UCalendarDateFields        field)
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal)->isSet(field);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_clearField(    UCalendar*            cal,
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UCalendarDateFields field)
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)cal)->clear(field);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void  U_EXPORT2
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_clear(UCalendar* calendar)
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((Calendar*)calendar)->clear();
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t  U_EXPORT2
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getLimit(    const    UCalendar*              cal,
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCalendarDateFields     field,
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCalendarLimitType      type,
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode        *status)
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==0 || U_FAILURE(*status)) {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(type) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_MINIMUM:
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getMinimum(field);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_MAXIMUM:
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getMaximum(field);
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_GREATEST_MINIMUM:
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getGreatestMinimum(field);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_LEAST_MAXIMUM:
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getLeastMaximum(field);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_ACTUAL_MINIMUM:
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getActualMinimum(field,
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          *status);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCAL_ACTUAL_MAXIMUM:
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return ((Calendar*)cal)->getActualMaximum(field,
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          *status);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  default:
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return -1;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char * U_EXPORT2
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status)
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal == NULL) {
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(*status)) {
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_ILLEGAL_ARGUMENT_ERROR;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((Calendar*)cal)->getLocaleID(type, *status);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char * U_EXPORT2
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucal_getTZDataVersion(UErrorCode* status)
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TimeZone::getTZDataVersion(*status);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruucal_getCanonicalTimeZoneID(const UChar* id, int32_t len,
565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                            UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status) {
566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(status == 0 || U_FAILURE(*status)) {
567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return 0;
568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (isSystemID) {
570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *isSystemID = FALSE;
571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (id == 0 || len == 0 || result == 0 || resultCapacity <= 0) {
573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return 0;
575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t reslen = 0;
577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString canonical;
578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool systemID = FALSE;
579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TimeZone::getCanonicalID(UnicodeString(id, len), canonical, systemID, *status);
580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_SUCCESS(*status)) {
581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (isSystemID) {
582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            *isSystemID = systemID;
583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        reslen = canonical.extract(result, resultCapacity, *status);
585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return reslen;
587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI const char * U_EXPORT2
590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_getType(const UCalendar *cal, UErrorCode* status)
591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status)) {
593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return NULL;
594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return ((Calendar*)cal)->getType();
596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
59850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UCalendarWeekdayType U_EXPORT2
59950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_getDayOfWeekType(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode* status)
60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(*status)) {
60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return UCAL_WEEKDAY;
60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
60450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return ((Calendar*)cal)->getDayOfWeekType(dayOfWeek, *status);
60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
60650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
60750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
60850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_getWeekendTransition(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode *status)
60950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
61050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(*status)) {
61150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return 0;
61250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return ((Calendar*)cal)->getWeekendTransition(dayOfWeek, *status);
61450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
61550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
61650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UBool U_EXPORT2
61750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucal_isWeekend(const UCalendar *cal, UDate date, UErrorCode *status)
61850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
61950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(*status)) {
62050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return FALSE;
62150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
62250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return ((Calendar*)cal)->isWeekend(date, *status);
62350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
62450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CAPI int32_t  U_EXPORT2
626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoucal_getFieldDifference(UCalendar* cal, UDate target,
627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        UCalendarDateFields field,
628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        UErrorCode* status )
629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(*status)) {
631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return 0;
632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return ((Calendar*)cal)->fieldDifference(target, field, *status);
634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UEnumeration defaultKeywordValues = {
638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    NULL,
639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    NULL,
640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ulist_close_keyword_values_iterator,
641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ulist_count_keyword_values,
642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uenum_unextDefault,
643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ulist_next_keyword_value,
644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ulist_reset_keyword_values_iterator
645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char * const CAL_TYPES[] = {
648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "gregorian",
649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "japanese",
650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "buddhist",
651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "roc",
652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "persian",
653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "islamic-civil",
654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "islamic",
655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "hebrew",
656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "chinese",
657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "indian",
658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "coptic",
659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ethiopic",
660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "ethiopic-amete-alem",
66159d709d503bab6e2b61931737e662dd293b40578ccornelius        "iso8601",
66259d709d503bab6e2b61931737e662dd293b40578ccornelius        "dangi",
66359d709d503bab6e2b61931737e662dd293b40578ccornelius        "islamic-umalqura",
66459d709d503bab6e2b61931737e662dd293b40578ccornelius        "islamic-tbla",
66559d709d503bab6e2b61931737e662dd293b40578ccornelius        "islamic-rgsa",
666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        NULL
667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CAPI UEnumeration* U_EXPORT2
670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruucal_getKeywordValuesForLocale(const char * /* key */, const char* locale, UBool commonlyUsed, UErrorCode *status) {
671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Resolve region
672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char prefRegion[ULOC_FULLNAME_CAPACITY] = "";
673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t prefRegionLength = 0;
674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    prefRegionLength = uloc_getCountry(locale, prefRegion, sizeof(prefRegion), status);
675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (prefRegionLength == 0) {
676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        char loc[ULOC_FULLNAME_CAPACITY] = "";
677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        uloc_addLikelySubtags(locale, loc, sizeof(loc), status);
678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        prefRegionLength = uloc_getCountry(loc, prefRegion, sizeof(prefRegion), status);
680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Read preferred calendar values from supplementalData calendarPreference
683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UResourceBundle *rb = ures_openDirect(NULL, "supplementalData", status);
684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_getByKey(rb, "calendarPreferenceData", rb, status);
685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UResourceBundle *order = ures_getByKey(rb, prefRegion, NULL, status);
686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (*status == U_MISSING_RESOURCE_ERROR && rb != NULL) {
687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_ZERO_ERROR;
688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        order = ures_getByKey(rb, "001", NULL, status);
689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Create a list of calendar type strings
692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UList *values = NULL;
693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_SUCCESS(*status)) {
694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        values = ulist_createEmptyList(status);
695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_SUCCESS(*status)) {
696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            for (int i = 0; i < ures_getSize(order); i++) {
697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                int32_t len;
698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                const UChar *type = ures_getStringByIndex(order, i, &len, status);
699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                char *caltype = (char*)uprv_malloc(len + 1);
700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (caltype == NULL) {
701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    *status = U_MEMORY_ALLOCATION_ERROR;
702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    break;
703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                u_UCharsToChars(type, caltype, len);
705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                *(caltype + len) = 0;
706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                ulist_addItemEndList(values, caltype, TRUE, status);
708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (U_FAILURE(*status)) {
709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    break;
710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_SUCCESS(*status) && !commonlyUsed) {
714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                // If not commonlyUsed, add other available values
715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                for (int32_t i = 0; CAL_TYPES[i] != NULL; i++) {
71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    if (!ulist_containsString(values, CAL_TYPES[i], (int32_t)uprv_strlen(CAL_TYPES[i]))) {
717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        ulist_addItemEndList(values, CAL_TYPES[i], FALSE, status);
718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        if (U_FAILURE(*status)) {
719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            break;
720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        }
721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    }
722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (U_FAILURE(*status)) {
725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                ulist_deleteList(values);
726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                values = NULL;
727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_close(order);
732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ures_close(rb);
733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (U_FAILURE(*status) || values == NULL) {
735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return NULL;
736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Create string enumeration
739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UEnumeration *en = (UEnumeration*)uprv_malloc(sizeof(UEnumeration));
740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (en == NULL) {
741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ulist_deleteList(values);
743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return NULL;
744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ulist_resetList(values);
746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    memcpy(en, &defaultKeywordValues, sizeof(UEnumeration));
747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    en->context = values;
748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return en;
749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
75154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI UBool U_EXPORT2
75254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusucal_getTimeZoneTransitionDate(const UCalendar* cal, UTimeZoneTransitionType type,
75354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                               UDate* transition, UErrorCode* status)
75454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{
75554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (U_FAILURE(*status)) {
75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return FALSE;
75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UDate base = ((Calendar*)cal)->getTime(*status);
75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    const TimeZone& tz = ((Calendar*)cal)->getTimeZone();
76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    const BasicTimeZone * btz = dynamic_cast<const BasicTimeZone *>(&tz);
76154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (btz != NULL && U_SUCCESS(*status)) {
76254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        TimeZoneTransition tzt;
76354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UBool inclusive = (type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE || type == UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE);
76454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UBool result = (type == UCAL_TZ_TRANSITION_NEXT || type == UCAL_TZ_TRANSITION_NEXT_INCLUSIVE)?
7658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        btz->getNextTransition(base, inclusive, tzt):
7668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        btz->getPreviousTransition(base, inclusive, tzt);
76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (result) {
76854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            *transition = tzt.getTime();
76954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            return TRUE;
77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
77154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return FALSE;
77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
77454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
77559d709d503bab6e2b61931737e662dd293b40578ccornelius#ifndef U_HIDE_DRAFT_API
77659d709d503bab6e2b61931737e662dd293b40578ccorneliusU_CAPI int32_t U_EXPORT2
77759d709d503bab6e2b61931737e662dd293b40578ccorneliusucal_getWindowsTimeZoneID(const UChar* id, int32_t len, UChar* winid, int32_t winidCapacity, UErrorCode* status) {
77859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(*status)) {
77959d709d503bab6e2b61931737e662dd293b40578ccornelius        return 0;
78059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
78159d709d503bab6e2b61931737e662dd293b40578ccornelius
78259d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t resultLen = 0;
78359d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString resultWinID;
78459d709d503bab6e2b61931737e662dd293b40578ccornelius
78559d709d503bab6e2b61931737e662dd293b40578ccornelius    TimeZone::getWindowsID(UnicodeString(id, len), resultWinID, *status);
78659d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_SUCCESS(*status) && resultWinID.length() > 0) {
78759d709d503bab6e2b61931737e662dd293b40578ccornelius        resultLen = resultWinID.length();
78859d709d503bab6e2b61931737e662dd293b40578ccornelius        resultWinID.extract(winid, winidCapacity, *status);
78959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
79059d709d503bab6e2b61931737e662dd293b40578ccornelius
79159d709d503bab6e2b61931737e662dd293b40578ccornelius    return resultLen;
79259d709d503bab6e2b61931737e662dd293b40578ccornelius}
79359d709d503bab6e2b61931737e662dd293b40578ccornelius
79459d709d503bab6e2b61931737e662dd293b40578ccorneliusU_CAPI int32_t U_EXPORT2
79559d709d503bab6e2b61931737e662dd293b40578ccorneliusucal_getTimeZoneIDForWindowsID(const UChar* winid, int32_t len, const char* region, UChar* id, int32_t idCapacity, UErrorCode* status) {
79659d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(*status)) {
79759d709d503bab6e2b61931737e662dd293b40578ccornelius        return 0;
79859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
79959d709d503bab6e2b61931737e662dd293b40578ccornelius
80059d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t resultLen = 0;
80159d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString resultID;
80259d709d503bab6e2b61931737e662dd293b40578ccornelius
80359d709d503bab6e2b61931737e662dd293b40578ccornelius    TimeZone::getIDForWindowsID(UnicodeString(winid, len), region, resultID, *status);
80459d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_SUCCESS(*status) && resultID.length() > 0) {
80559d709d503bab6e2b61931737e662dd293b40578ccornelius        resultLen = resultID.length();
80659d709d503bab6e2b61931737e662dd293b40578ccornelius        resultID.extract(id, idCapacity, *status);
80759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
80859d709d503bab6e2b61931737e662dd293b40578ccornelius
80959d709d503bab6e2b61931737e662dd293b40578ccornelius    return resultLen;
81059d709d503bab6e2b61931737e662dd293b40578ccornelius}
81159d709d503bab6e2b61931737e662dd293b40578ccornelius
81259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif /* U_HIDE_DRAFT_API */
81359d709d503bab6e2b61931737e662dd293b40578ccornelius
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
815