コード例 #1
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static String HHVM_METHOD(IntlDateFormatter, format, CVarRef value) {
  DATFMT_GET(data, this_, null_string);
  double ts = data->getTimestamp(value);
  if (ts == NAN) {
    return null_string;
  }
  UErrorCode error = U_ZERO_ERROR;
  int32_t len = udat_format(data->datefmt(), ts, nullptr, 0, nullptr, &error);
  if (error != U_BUFFER_OVERFLOW_ERROR) {
    data->setError(error);
    return null_string;
  }
  error = U_ZERO_ERROR;
  String ret((len + 1) * sizeof(UChar), ReserveString);
  udat_format(data->datefmt(), ts, (UChar*)ret->mutableData(),
              ret->capacity() / sizeof(UChar), nullptr, &error);
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  ret->setSize(len * sizeof(UChar));
  String out(u8(ret, error));
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  return out;
}
コード例 #2
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static Variant HHVM_METHOD(IntlDateFormatter, parse,
                           const String& value, VRefParam position) {
  DATFMT_GET(data, this_, 0);
  int32_t pos = position.toInt64();
  if (pos > value.size()) {
    return false;
  }

  UErrorCode error = U_ZERO_ERROR;
  String str(u16(value, error));
  if (U_FAILURE(error)) {
    data->setError(error, "Error converting timezone to UTF-16");
    return false;
  }
  error = U_ZERO_ERROR;
  UDate timestamp = udat_parse(data->datefmt(),
                               (UChar*)str.c_str(), str.size() / sizeof(UChar),
                               &pos, &error);
  position = (int64_t)pos;
  if (U_FAILURE(error)) {
    data->setError(error, "Date parsing failed");
    return false;
  }

  double result = (double)timestamp / U_MILLIS_PER_SECOND;
  if ((result > LONG_MAX) || (result < -LONG_MAX)) {
    return (double)((result > 0) ? ceil(result) : floor(result));
  } else {
    return (int64_t)result;
  }
}
コード例 #3
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: RdeWilde/hhvm
static String HHVM_METHOD(IntlDateFormatter, format, CVarRef value) {
  DATFMT_GET(data, this_, null_string);
  double ts = data->getTimestamp(value);
  if (ts == NAN) {
    return null_string;
  }
  UErrorCode error = U_ZERO_ERROR;
  int32_t len = udat_format(data->datefmt(), ts, nullptr, 0, nullptr, &error);
  if (error != U_BUFFER_OVERFLOW_ERROR) {
    data->setError(error);
    return null_string;
  }
  error = U_ZERO_ERROR;
  icu::UnicodeString ret;
  auto *buffer = ret.getBuffer(len + 1);
  udat_format(data->datefmt(), ts, buffer, len + 1, nullptr, &error);
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  ret.releaseBuffer(len);
  String out(u8(ret, error));
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  return out;
}
コード例 #4
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static bool HHVM_METHOD(IntlDateFormatter, setTimeZone, CVarRef zone) {
  DATFMT_GET(data, this_, false);
  icu::TimeZone *tz = IntlTimeZone::ParseArg(zone, "datefmt_set_timezone",
                                             data->m_error);
  if (tz == nullptr) {
    return false;
  }
  data->datefmtObject()->adoptTimeZone(tz);
  return true;
}
コード例 #5
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static Object HHVM_METHOD(IntlDateFormatter, getTimeZone) {
  DATFMT_GET(data, this_, null_object);
  const icu::TimeZone& tz = data->datefmtObject()->getTimeZone();
  auto ntz = tz.clone();
  if (!ntz) {
    data->setError(U_MEMORY_ALLOCATION_ERROR,
                   "datefmt_get_timezone: Out of memory "
                   "when cloning time zone");
    return null_object;
  }
  return (NEWOBJ(IntlTimeZone)(ntz, true))->wrap();
}
コード例 #6
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static String HHVM_METHOD(IntlDateFormatter, getTimeZoneId) {
  DATFMT_GET(data, this_, 0);
  UnicodeString id;
  data->datefmtObject()->getTimeZone().getID(id);
  UErrorCode error = U_ZERO_ERROR;
  String ret(u8(id, error));
  if (U_FAILURE(error)) {
    data->setError(error, "Could not convert time zone id to UTF-8");
    return null_string;
  }
  return ret;
}
コード例 #7
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static Variant HHVM_METHOD(IntlDateFormatter, localtime,
                           const String& value, VRefParam position) {
  DATFMT_GET(data, this_, uninit_null());
  int32_t parse_pos = -1;
  if (!position.isNull()) {
    parse_pos = position.toInt64();
    if (parse_pos > value.size()) {
      return false;
    }
  }

  UErrorCode error = U_ZERO_ERROR;
  String uValue(u16(value, error));
  if (U_FAILURE(error)) {
    data->setError(error, "Error converting timezone to UTF-16");
    return false;
  }

  error = U_ZERO_ERROR;
  UCalendar *cal = const_cast<UCalendar*>(udat_getCalendar(data->datefmt()));
  udat_parseCalendar(data->datefmt(), cal,
                     (UChar*)uValue.c_str(), uValue.size() / sizeof(UChar),
                     &parse_pos, &error);

  Array ret = Array::Create();
  error = U_ZERO_ERROR;
  add_to_localtime_arr(ret, cal, UCAL_SECOND, s_tm_sec, error);
  add_to_localtime_arr(ret, cal, UCAL_MINUTE, s_tm_min, error);
  add_to_localtime_arr(ret, cal, UCAL_HOUR_OF_DAY, s_tm_hour, error);
  add_to_localtime_arr(ret, cal, UCAL_YEAR, s_tm_year, error, -1900);
  add_to_localtime_arr(ret, cal, UCAL_DAY_OF_MONTH, s_tm_mday, error);
  add_to_localtime_arr(ret, cal, UCAL_DAY_OF_WEEK, s_tm_wday, error, -1);
  add_to_localtime_arr(ret, cal, UCAL_DAY_OF_YEAR, s_tm_yday, error);
  add_to_localtime_arr(ret, cal, UCAL_MONTH, s_tm_mon, error);
  if (U_FAILURE(error)) {
    data->setError(error, "Date parsing - localtime failed : "
                          "could not get a field from calendar");
    return false;
  }

  error = U_ZERO_ERROR;
  auto isDST = ucal_inDaylightTime(cal, &error);
  if (U_FAILURE(error)) {
    data->setError(error, "Date parsing - localtime failed : "
                          "while checking if currently in DST.");
    return false;
  }
  ret.set(s_tm_isdst, isDST ? 1 : 0);

  position = (int64_t)parse_pos;
  return ret;
}
コード例 #8
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static bool HHVM_METHOD(IntlDateFormatter, setPattern,
                        const String& pattern) {
  DATFMT_GET(data, this_, false);
  UErrorCode error = U_ZERO_ERROR;
  String pat(u16(pattern, error));
  if (U_FAILURE(error)) {
    data->setError(error, "Error converting pattern to UTF-16");
    return false;
  }
  udat_applyPattern(data->datefmt(), (UBool)false,
                    (UChar*)pat.c_str(), pat.size() / sizeof(UChar));
  return true;
}
コード例 #9
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: RdeWilde/hhvm
static bool HHVM_METHOD(IntlDateFormatter, setPattern,
                        const String& pattern) {
  DATFMT_GET(data, this_, false);
  UErrorCode error = U_ZERO_ERROR;
  icu::UnicodeString pat(u16(pattern, error));
  if (U_FAILURE(error)) {
    data->setError(error, "Error converting pattern to UTF-16");
    return false;
  }
  udat_applyPattern(data->datefmt(), (UBool)false,
                    pat.getBuffer(), pat.length());
  return true;
}
コード例 #10
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static String HHVM_METHOD(IntlDateFormatter, getLocale, CVarRef which) {
  ULocDataLocaleType whichloc = ULOC_ACTUAL_LOCALE;
  if (!which.isNull()) whichloc = (ULocDataLocaleType)which.toInt64();

  DATFMT_GET(data, this_, null_string);
  UErrorCode error = U_ZERO_ERROR;
  const char *loc = udat_getLocaleByType(data->datefmt(), whichloc, &error);
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  return String(loc, CopyString);
}
コード例 #11
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: RdeWilde/hhvm
static String HHVM_METHOD(IntlDateFormatter, getPattern) {
  DATFMT_GET(data, this_, null_string);
  UErrorCode error = U_ZERO_ERROR;
  int32_t len = udat_toPattern(data->datefmt(), false, nullptr, 0, &error);
  icu::UnicodeString tmp;
  auto buf = tmp.getBuffer(len + 1);
  error = U_ZERO_ERROR;
  udat_toPattern(data->datefmt(), false, buf, len + 1, &error);
  if (U_FAILURE(error)) {
    data->setError(error, "Error getting formatter pattern");
    return null_string;
  }
  tmp.releaseBuffer(len);
  String ret(u8(tmp, error));
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  return ret;
}
コード例 #12
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static String HHVM_METHOD(IntlDateFormatter, getPattern) {
  DATFMT_GET(data, this_, null_string);
  UErrorCode error = U_ZERO_ERROR;
  int32_t len = udat_toPattern(data->datefmt(), false, nullptr, 0, &error);
  String buf((len+1) * sizeof(UChar), ReserveString);
  error = U_ZERO_ERROR;
  udat_toPattern(data->datefmt(), false, (UChar*)buf->mutableData(),
                 buf->capacity() / sizeof(UChar), &error);
  if (U_FAILURE(error)) {
    data->setError(error, "Error getting formatter pattern");
    return null_string;
  }
  buf->setSize(len * sizeof(UChar));
  String ret(u8(buf, error));
  if (U_FAILURE(error)) {
    data->setError(error);
    return null_string;
  }
  return ret;
}
コード例 #13
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static int64_t HHVM_METHOD(IntlDateFormatter, getTimeType) {
  DATFMT_GET(data, this_, 0);
  return data->timeType();
}
コード例 #14
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static bool HHVM_METHOD(IntlDateFormatter, setLenient, bool lenient) {
  DATFMT_GET(data, this_, false);
  udat_setLenient(data->datefmt(), (UBool)lenient);
  return true;
}
コード例 #15
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static bool HHVM_METHOD(IntlDateFormatter, isLenient) {
  DATFMT_GET(data, this_, false);
  return udat_isLenient(data->datefmt());
}
コード例 #16
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static String HHVM_METHOD(IntlDateFormatter, getErrorMessage) {
  DATFMT_GET(data, this_, null_string);
  return data->getErrorMessage();
}
コード例 #17
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static int64_t HHVM_METHOD(IntlDateFormatter, getErrorCode) {
  DATFMT_GET(data, this_, 0);
  return data->getErrorCode();
}
コード例 #18
0
ファイル: ext_icu_date_fmt.cpp プロジェクト: BiggDaddy/hhvm
static int64_t HHVM_METHOD(IntlDateFormatter, getCalendar) {
  DATFMT_GET(data, this_, 0);
  return data->calendar();
}