16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1996-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udat.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/datefmt.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/timezone.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/smpdtfmt.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/fieldpos.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/parsepos.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/numfmt.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/dtfmtsym.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udisplaycontext.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cpputils.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "reldtfmt.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_USE
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Verify that fmt is a SimpleDateFormat. Invalid error if not.
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param fmt the UDateFormat, definitely a DateFormat, maybe something else
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status error code, will be set to failure if there is a familure or the fmt is NULL.
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verifyIsSimpleDateFormat(const UDateFormat* fmt, UErrorCode *status) {
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if(U_SUCCESS(*status) &&
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       dynamic_cast<const SimpleDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))==NULL) {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       *status = U_ILLEGAL_ARGUMENT_ERROR;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This mirrors the correspondence between the
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// SimpleDateFormat::fgPatternIndexToDateFormatField and
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// SimpleDateFormat::fgPatternIndexToCalendarField arrays.
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCalendarDateFields gDateFieldMapping[] = {
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_ERA,                  // UDAT_ERA_FIELD = 0
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_YEAR,                 // UDAT_YEAR_FIELD = 1
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MONTH,                // UDAT_MONTH_FIELD = 2
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DATE,                 // UDAT_DATE_FIELD = 3
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_HOUR_OF_DAY,          // UDAT_HOUR_OF_DAY1_FIELD = 4
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_HOUR_OF_DAY,          // UDAT_HOUR_OF_DAY0_FIELD = 5
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MINUTE,               // UDAT_MINUTE_FIELD = 6
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_SECOND,               // UDAT_SECOND_FIELD = 7
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MILLISECOND,          // UDAT_FRACTIONAL_SECOND_FIELD = 8
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DAY_OF_WEEK,          // UDAT_DAY_OF_WEEK_FIELD = 9
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DAY_OF_YEAR,          // UDAT_DAY_OF_YEAR_FIELD = 10
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DAY_OF_WEEK_IN_MONTH, // UDAT_DAY_OF_WEEK_IN_MONTH_FIELD = 11
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_WEEK_OF_YEAR,         // UDAT_WEEK_OF_YEAR_FIELD = 12
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_WEEK_OF_MONTH,        // UDAT_WEEK_OF_MONTH_FIELD = 13
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_AM_PM,                // UDAT_AM_PM_FIELD = 14
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_HOUR,                 // UDAT_HOUR1_FIELD = 15
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_HOUR,                 // UDAT_HOUR0_FIELD = 16
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_ZONE_OFFSET,          // UDAT_TIMEZONE_FIELD = 17
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_YEAR_WOY,             // UDAT_YEAR_WOY_FIELD = 18
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DOW_LOCAL,            // UDAT_DOW_LOCAL_FIELD = 19
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_EXTENDED_YEAR,        // UDAT_EXTENDED_YEAR_FIELD = 20
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_JULIAN_DAY,           // UDAT_JULIAN_DAY_FIELD = 21
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MILLISECONDS_IN_DAY,  // UDAT_MILLISECONDS_IN_DAY_FIELD = 22
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_ZONE_OFFSET,          // UDAT_TIMEZONE_RFC_FIELD = 23
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // UCAL_DST_OFFSET also
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_ZONE_OFFSET,          // UDAT_TIMEZONE_GENERIC_FIELD = 24
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_DOW_LOCAL,            // UDAT_STANDALONE_DAY_FIELD = 25
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MONTH,                // UDAT_STANDALONE_MONTH_FIELD = 26
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MONTH,                // UDAT_QUARTER_FIELD = 27
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_MONTH,                // UDAT_STANDALONE_QUARTER_FIELD = 28
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_ZONE_OFFSET,          // UDAT_TIMEZONE_SPECIAL_FIELD = 29
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_YEAR,                 // UDAT_YEAR_NAME_FIELD = 30
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCAL_FIELD_COUNT,          // UDAT_FIELD_COUNT = 31
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // UCAL_IS_LEAP_MONTH is not the target of a mapping
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UCalendarDateFields U_EXPORT2
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_toCalendarDateField(UDateFormatField field) {
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return gDateFieldMapping[field];
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* For now- one opener. */
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UDateFormatOpener gOpener = NULL;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL void U_EXPORT2
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_registerOpener(UDateFormatOpener opener, UErrorCode *status)
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  umtx_lock(NULL);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(gOpener==NULL) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gOpener = opener;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_ILLEGAL_ARGUMENT_ERROR;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  umtx_unlock(NULL);
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL UDateFormatOpener U_EXPORT2
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_unregisterOpener(UDateFormatOpener opener, UErrorCode *status)
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return NULL;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UDateFormatOpener oldOpener = NULL;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  umtx_lock(NULL);
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(gOpener==NULL || gOpener!=opener) {
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_ILLEGAL_ARGUMENT_ERROR;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    oldOpener=gOpener;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gOpener=NULL;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  umtx_unlock(NULL);
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return oldOpener;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UDateFormat* U_EXPORT2
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_open(UDateFormatStyle  timeStyle,
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UDateFormatStyle  dateStyle,
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          const char        *locale,
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          const UChar       *tzID,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t           tzIDLength,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          const UChar       *pattern,
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t           patternLength,
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode        *status)
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *fmt;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) {
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(gOpener!=NULL) { // if it's registered
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fmt = (DateFormat*) (*gOpener)(timeStyle,dateStyle,locale,tzID,tzIDLength,pattern,patternLength,status);
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(fmt!=NULL) {
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UDateFormat*)fmt;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } // else fall through.
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(timeStyle != UDAT_PATTERN) {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(locale == 0) {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle,
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (DateFormat::EStyle)timeStyle);
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt = DateFormat::createDateTimeInstance((DateFormat::EStyle)dateStyle,
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                (DateFormat::EStyle)timeStyle,
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                Locale(locale));
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(locale == 0) {
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt = new SimpleDateFormat(pat, *status);
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt = new SimpleDateFormat(pat, Locale(locale), *status);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fmt == 0) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_MEMORY_ALLOCATION_ERROR;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(tzID != 0) {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone *zone = TimeZone::createTimeZone(UnicodeString((UBool)(tzIDLength == -1), tzID, tzIDLength));
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(zone == 0) {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *status = U_MEMORY_ALLOCATION_ERROR;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete fmt;
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt->adoptTimeZone(zone);
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UDateFormat*)fmt;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_close(UDateFormat* format)
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete (DateFormat*)format;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UDateFormat* U_EXPORT2
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_clone(const UDateFormat *fmt,
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       UErrorCode *status)
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return 0;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Format *res = ((DateFormat*)fmt)->clone();
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(res == 0) {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_MEMORY_ALLOCATION_ERROR;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UDateFormat*) res;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_format(    const    UDateFormat*    format,
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate           dateToFormat,
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar*          result,
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t         resultLength,
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UFieldPosition* position,
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode*     status)
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return -1;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString res;
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(result==NULL && resultLength==0)) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NULL destination for pure preflighting: empty dummy string
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // otherwise, alias the destination buffer
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res.setTo(result, 0, resultLength);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FieldPosition fp;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(position != 0)
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fp.setField(position->field);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((DateFormat*)format)->format(dateToFormat, res, fp);
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(position != 0) {
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        position->beginIndex = fp.getBeginIndex();
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        position->endIndex = fp.getEndIndex();
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return res.extract(result, resultLength, *status);
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UDate U_EXPORT2
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_parse(    const    UDateFormat*        format,
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const    UChar*          text,
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t         textLength,
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t         *parsePos,
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode      *status)
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return (UDate)0;
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString src((UBool)(textLength == -1), text, textLength);
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ParsePosition pp;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t stackParsePos = 0;
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate res;
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(parsePos == NULL) {
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        parsePos = &stackParsePos;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pp.setIndex(*parsePos);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    res = ((DateFormat*)format)->parse(src, pp);
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pp.getErrorIndex() == -1)
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *parsePos = pp.getIndex();
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *parsePos = pp.getErrorIndex();
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_PARSE_ERROR;
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return res;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_parseCalendar(const    UDateFormat*    format,
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UCalendar*      calendar,
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   const    UChar*          text,
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t         textLength,
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t         *parsePos,
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UErrorCode      *status)
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString src((UBool)(textLength == -1), text, textLength);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ParsePosition pp;
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(parsePos != 0)
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pp.setIndex(*parsePos);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((DateFormat*)format)->parse(src, *(Calendar*)calendar, pp);
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(parsePos != 0) {
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pp.getErrorIndex() == -1)
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *parsePos = pp.getIndex();
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *parsePos = pp.getErrorIndex();
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *status = U_PARSE_ERROR;
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UBool U_EXPORT2
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_isLenient(const UDateFormat* fmt)
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((DateFormat*)fmt)->isLenient();
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_setLenient(    UDateFormat*    fmt,
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UBool          isLenient)
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((DateFormat*)fmt)->setLenient(isLenient);
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const UCalendar* U_EXPORT2
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getCalendar(const UDateFormat* fmt)
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (const UCalendar*) ((DateFormat*)fmt)->getCalendar();
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_setCalendar(UDateFormat*    fmt,
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 const   UCalendar*      calendarToSet)
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((DateFormat*)fmt)->setCalendar(*((Calendar*)calendarToSet));
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const UNumberFormat* U_EXPORT2
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getNumberFormat(const UDateFormat* fmt)
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (const UNumberFormat*) ((DateFormat*)fmt)->getNumberFormat();
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_setNumberFormat(UDateFormat*    fmt,
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     const   UNumberFormat*  numberFormatToSet)
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((DateFormat*)fmt)->setNumberFormat(*((NumberFormat*)numberFormatToSet));
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getAvailable(int32_t index)
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return uloc_getAvailable(index);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_countAvailable()
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return uloc_countAvailable();
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UDate U_EXPORT2
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_get2DigitYearStart(    const   UDateFormat     *fmt,
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UErrorCode      *status)
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(fmt, status);
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return (UDate)0;
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((SimpleDateFormat*)fmt)->get2DigitYearStart(*status);
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_set2DigitYearStart(    UDateFormat     *fmt,
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UDate           d,
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UErrorCode      *status)
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(fmt, status);
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return;
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((SimpleDateFormat*)fmt)->set2DigitYearStart(d, *status);
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_toPattern(    const   UDateFormat     *fmt,
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool          localized,
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar           *result,
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t         resultLength,
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode      *status)
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return -1;
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString res;
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(result==NULL && resultLength==0)) {
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NULL destination for pure preflighting: empty dummy string
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // otherwise, alias the destination buffer
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res.setTo(result, 0, resultLength);
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const DateFormat *df=reinterpret_cast<const DateFormat *>(fmt);
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const SimpleDateFormat *sdtfmt=dynamic_cast<const SimpleDateFormat *>(df);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const RelativeDateFormat *reldtfmt;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (sdtfmt!=NULL) {
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(localized)
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdtfmt->toLocalizedPattern(res, *status);
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdtfmt->toPattern(res);
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (!localized && (reldtfmt=dynamic_cast<const RelativeDateFormat *>(df))!=NULL) {
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        reldtfmt->toPattern(res, *status);
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_ILLEGAL_ARGUMENT_ERROR;
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return res.extract(result, resultLength, *status);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TODO: should this take an UErrorCode?
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// A: Yes. Of course.
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_applyPattern(  UDateFormat     *format,
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UBool          localized,
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    const   UChar           *pattern,
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    int32_t         patternLength)
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString pat((UBool)(patternLength == -1), pattern, patternLength);
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(format, &status);
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(localized)
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((SimpleDateFormat*)format)->applyLocalizedPattern(pat, status);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ((SimpleDateFormat*)format)->applyPattern(pat);
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getSymbols(const   UDateFormat     *fmt,
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDateFormatSymbolType   type,
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t                 index,
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UChar                   *result,
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t                 resultLength,
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UErrorCode              *status)
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const DateFormatSymbols *syms;
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const SimpleDateFormat* sdtfmt;
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const RelativeDateFormat* rdtfmt;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((sdtfmt = dynamic_cast<const SimpleDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))) != NULL) {
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms = sdtfmt->getDateFormatSymbols();
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if ((rdtfmt = dynamic_cast<const RelativeDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))) != NULL) {
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms = rdtfmt->getDateFormatSymbols();
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return -1;
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count;
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString *res = NULL;
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(type) {
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERAS:
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getEras(count);
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERA_NAMES:
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getEraNames(count);
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_MONTHS:
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getMonths(count);
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_MONTHS:
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getShortMonths(count);
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_WEEKDAYS:
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_WEEKDAYS:
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getShortWeekdays(count);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_AM_PMS:
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getAmPmStrings(count);
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_LOCALIZED_CHARS:
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString res1;
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(!(result==NULL && resultLength==0)) {
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // NULL destination for pure preflighting: empty dummy string
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // otherwise, alias the destination buffer
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                res1.setTo(result, 0, resultLength);
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            syms->getLocalPatternChars(res1);
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return res1.extract(result, resultLength, *status);
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_MONTHS:
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW);
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORTER_WEEKDAYS:
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::SHORT);
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_WEEKDAYS:
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW);
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_MONTHS:
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_MONTHS:
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_MONTHS:
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW);
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_WEEKDAYS:
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_WEEKDAYS:
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORTER_WEEKDAYS:
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::SHORT);
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_WEEKDAYS:
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW);
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_QUARTERS:
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getQuarters(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_QUARTERS:
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getQuarters(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED);
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_QUARTERS:
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getQuarters(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_QUARTERS:
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        res = syms->getQuarters(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(index < count) {
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return res[index].extract(result, resultLength, *status);
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TODO: also needs an errorCode.
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_countSymbols(    const    UDateFormat                *fmt,
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDateFormatSymbolType    type)
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const DateFormatSymbols *syms;
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const SimpleDateFormat* sdtfmt;
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const RelativeDateFormat* rdtfmt;
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((sdtfmt = dynamic_cast<const SimpleDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))) != NULL) {
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms = sdtfmt->getDateFormatSymbols();
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if ((rdtfmt = dynamic_cast<const RelativeDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))) != NULL) {
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms = rdtfmt->getDateFormatSymbols();
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count = 0;
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(type) {
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERAS:
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getEras(count);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_MONTHS:
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getMonths(count);
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_MONTHS:
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getShortMonths(count);
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_WEEKDAYS:
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count);
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_WEEKDAYS:
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getShortWeekdays(count);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_AM_PMS:
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getAmPmStrings(count);
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_LOCALIZED_CHARS:
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count = 1;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERA_NAMES:
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getEraNames(count);
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_MONTHS:
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getMonths(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW);
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORTER_WEEKDAYS:
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::SHORT);
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_WEEKDAYS:
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::FORMAT, DateFormatSymbols::NARROW);
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_MONTHS:
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_MONTHS:
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_MONTHS:
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getMonths(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW);
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_WEEKDAYS:
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_WEEKDAYS:
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORTER_WEEKDAYS:
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::SHORT);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_WEEKDAYS:
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getWeekdays(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::NARROW);
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_QUARTERS:
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getQuarters(count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE);
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_QUARTERS:
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getQuarters(count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED);
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_QUARTERS:
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getQuarters(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_QUARTERS:
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        syms->getQuarters(count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return count;
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This DateFormatSymbolsSingleSetter class is a friend of DateFormatSymbols
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * solely for the purpose of avoiding to clone the array of strings
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * just to modify one of them and then setting all of them back.
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example, the old code looked like this:
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  case UDAT_MONTHS:
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    res = syms->getMonths(count);
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    array = new UnicodeString[count];
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    if(array == 0) {
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *      *status = U_MEMORY_ALLOCATION_ERROR;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *      return;
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    }
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    uprv_arrayCopy(res, array, count);
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    if(index < count)
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *      array[index] = val;
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    syms->setMonths(array, count);
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    break;
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Even worse, the old code actually cloned the entire DateFormatSymbols object,
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cloned one value array, changed one value, and then made the SimpleDateFormat
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * replace its DateFormatSymbols object with the new one.
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * markus 2002-oct-14
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass DateFormatSymbolsSingleSetter /* not : public UObject because all methods are static */ {
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(UnicodeString *array, int32_t count, int32_t index,
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(array!=NULL) {
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(index>=count) {
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if(value==NULL) {
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errorCode=U_ILLEGAL_ARGUMENT_ERROR;
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                array[index].setTo(value, valueLength);
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setEra(DateFormatSymbols *syms, int32_t index,
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fEras, syms->fErasCount, index, value, valueLength, errorCode);
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setEraName(DateFormatSymbols *syms, int32_t index,
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fEraNames, syms->fEraNamesCount, index, value, valueLength, errorCode);
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setMonth(DateFormatSymbols *syms, int32_t index,
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fMonths, syms->fMonthsCount, index, value, valueLength, errorCode);
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setShortMonth(DateFormatSymbols *syms, int32_t index,
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fShortMonths, syms->fShortMonthsCount, index, value, valueLength, errorCode);
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setNarrowMonth(DateFormatSymbols *syms, int32_t index,
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fNarrowMonths, syms->fNarrowMonthsCount, index, value, valueLength, errorCode);
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneMonth(DateFormatSymbols *syms, int32_t index,
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneMonths, syms->fStandaloneMonthsCount, index, value, valueLength, errorCode);
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneShortMonth(DateFormatSymbols *syms, int32_t index,
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneShortMonths, syms->fStandaloneShortMonthsCount, index, value, valueLength, errorCode);
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneNarrowMonth(DateFormatSymbols *syms, int32_t index,
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneNarrowMonths, syms->fStandaloneNarrowMonthsCount, index, value, valueLength, errorCode);
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setWeekday(DateFormatSymbols *syms, int32_t index,
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fWeekdays, syms->fWeekdaysCount, index, value, valueLength, errorCode);
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setShortWeekday(DateFormatSymbols *syms, int32_t index,
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fShortWeekdays, syms->fShortWeekdaysCount, index, value, valueLength, errorCode);
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setShorterWeekday(DateFormatSymbols *syms, int32_t index,
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fShorterWeekdays, syms->fShorterWeekdaysCount, index, value, valueLength, errorCode);
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setNarrowWeekday(DateFormatSymbols *syms, int32_t index,
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fNarrowWeekdays, syms->fNarrowWeekdaysCount, index, value, valueLength, errorCode);
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneWeekday(DateFormatSymbols *syms, int32_t index,
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneWeekdays, syms->fStandaloneWeekdaysCount, index, value, valueLength, errorCode);
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneShortWeekday(DateFormatSymbols *syms, int32_t index,
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneShortWeekdays, syms->fStandaloneShortWeekdaysCount, index, value, valueLength, errorCode);
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneShorterWeekday(DateFormatSymbols *syms, int32_t index,
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneShorterWeekdays, syms->fStandaloneShorterWeekdaysCount, index, value, valueLength, errorCode);
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneNarrowWeekday(DateFormatSymbols *syms, int32_t index,
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneNarrowWeekdays, syms->fStandaloneNarrowWeekdaysCount, index, value, valueLength, errorCode);
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setQuarter(DateFormatSymbols *syms, int32_t index,
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fQuarters, syms->fQuartersCount, index, value, valueLength, errorCode);
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setShortQuarter(DateFormatSymbols *syms, int32_t index,
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fShortQuarters, syms->fShortQuartersCount, index, value, valueLength, errorCode);
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneQuarter(DateFormatSymbols *syms, int32_t index,
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneQuarters, syms->fStandaloneQuartersCount, index, value, valueLength, errorCode);
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setStandaloneShortQuarter(DateFormatSymbols *syms, int32_t index,
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fStandaloneShortQuarters, syms->fStandaloneShortQuartersCount, index, value, valueLength, errorCode);
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setAmPm(DateFormatSymbols *syms, int32_t index,
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(syms->fAmPms, syms->fAmPmsCount, index, value, valueLength, errorCode);
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setLocalPatternChars(DateFormatSymbols *syms,
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar *value, int32_t valueLength, UErrorCode &errorCode)
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        setSymbol(&syms->fLocalPatternChars, 1, 0, value, valueLength, errorCode);
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_setSymbols(    UDateFormat             *format,
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDateFormatSymbolType   type,
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t                 index,
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar                   *value,
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t                 valueLength,
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UErrorCode              *status)
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(format, status);
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return;
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormatSymbols *syms = (DateFormatSymbols *)((SimpleDateFormat *)format)->getDateFormatSymbols();
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(type) {
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERAS:
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setEra(syms, index, value, valueLength, *status);
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_ERA_NAMES:
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setEraName(syms, index, value, valueLength, *status);
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_MONTHS:
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setMonth(syms, index, value, valueLength, *status);
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_MONTHS:
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setShortMonth(syms, index, value, valueLength, *status);
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_MONTHS:
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setNarrowMonth(syms, index, value, valueLength, *status);
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_MONTHS:
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneMonth(syms, index, value, valueLength, *status);
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_MONTHS:
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneShortMonth(syms, index, value, valueLength, *status);
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_MONTHS:
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneNarrowMonth(syms, index, value, valueLength, *status);
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_WEEKDAYS:
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setWeekday(syms, index, value, valueLength, *status);
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_WEEKDAYS:
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setShortWeekday(syms, index, value, valueLength, *status);
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORTER_WEEKDAYS:
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setShorterWeekday(syms, index, value, valueLength, *status);
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_NARROW_WEEKDAYS:
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setNarrowWeekday(syms, index, value, valueLength, *status);
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_WEEKDAYS:
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneWeekday(syms, index, value, valueLength, *status);
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_WEEKDAYS:
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneShortWeekday(syms, index, value, valueLength, *status);
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORTER_WEEKDAYS:
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneShorterWeekday(syms, index, value, valueLength, *status);
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_NARROW_WEEKDAYS:
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneNarrowWeekday(syms, index, value, valueLength, *status);
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_QUARTERS:
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setQuarter(syms, index, value, valueLength, *status);
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_SHORT_QUARTERS:
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setShortQuarter(syms, index, value, valueLength, *status);
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_QUARTERS:
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneQuarter(syms, index, value, valueLength, *status);
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_STANDALONE_SHORT_QUARTERS:
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setStandaloneShortQuarter(syms, index, value, valueLength, *status);
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_AM_PMS:
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setAmPm(syms, index, value, valueLength, *status);
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UDAT_LOCALIZED_CHARS:
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormatSymbolsSingleSetter::setLocalPatternChars(syms, value, valueLength, *status);
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_UNSUPPORTED_ERROR;
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getLocaleByType(const UDateFormat *fmt,
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     ULocDataLocaleType type,
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UErrorCode* status)
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fmt == NULL) {
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(*status)) {
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *status = U_ILLEGAL_ARGUMENT_ERROR;
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((Format*)fmt)->getLocaleID(type, *status);
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_setContext(UDateFormat* fmt, UDisplayContext value, UErrorCode* status)
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(fmt, status);
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((SimpleDateFormat*)fmt)->setContext(value, *status);
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UDisplayContext U_EXPORT2
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_getContext(UDateFormat* fmt, UDisplayContextType type, UErrorCode* status)
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsSimpleDateFormat(fmt, status);
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(*status)) {
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return (UDisplayContext)0;
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ((SimpleDateFormat*)fmt)->getContext(type, *status);
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Verify that fmt is a RelativeDateFormat. Invalid error if not.
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param fmt the UDateFormat, definitely a DateFormat, maybe something else
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status error code, will be set to failure if there is a familure or the fmt is NULL.
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verifyIsRelativeDateFormat(const UDateFormat* fmt, UErrorCode *status) {
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if(U_SUCCESS(*status) &&
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       dynamic_cast<const RelativeDateFormat*>(reinterpret_cast<const DateFormat*>(fmt))==NULL) {
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       *status = U_ILLEGAL_ARGUMENT_ERROR;
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_toPatternRelativeDate(const UDateFormat *fmt,
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           UChar             *result,
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t           resultLength,
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           UErrorCode        *status)
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsRelativeDateFormat(fmt, status);
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return -1;
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString datePattern;
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(result==NULL && resultLength==0)) {
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NULL destination for pure preflighting: empty dummy string
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // otherwise, alias the destination buffer
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        datePattern.setTo(result, 0, resultLength);
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((RelativeDateFormat*)fmt)->toPatternDate(datePattern, *status);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return datePattern.extract(result, resultLength, *status);
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI int32_t U_EXPORT2
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_toPatternRelativeTime(const UDateFormat *fmt,
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           UChar             *result,
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t           resultLength,
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           UErrorCode        *status)
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsRelativeDateFormat(fmt, status);
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return -1;
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString timePattern;
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!(result==NULL && resultLength==0)) {
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NULL destination for pure preflighting: empty dummy string
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // otherwise, alias the destination buffer
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        timePattern.setTo(result, 0, resultLength);
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((RelativeDateFormat*)fmt)->toPatternTime(timePattern, *status);
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return timePattern.extract(result, resultLength, *status);
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgudat_applyPatternRelative(UDateFormat *format,
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          const UChar *datePattern,
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t     datePatternLength,
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          const UChar *timePattern,
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t     timePatternLength,
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          UErrorCode  *status)
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verifyIsRelativeDateFormat(format, status);
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(*status)) return;
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString datePat((UBool)(datePatternLength == -1), datePattern, datePatternLength);
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString timePat((UBool)(timePatternLength == -1), timePattern, timePatternLength);
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ((RelativeDateFormat*)format)->applyPatterns(datePat, timePat, *status);
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
1072