/* * Copyright (C) 1999-2000 Harri Porten ([email protected]) * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * Copyright (C) 2009 Google Inc. All rights reserved. * Copyright (C) 2007-2009 Torch Mobile, Inc. * Copyright (C) 2010 &yet, LLC. ([email protected]) * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Alternatively, the contents of this file may be used under the terms * of either the Mozilla Public License Version 1.1, found at * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html * (the "GPL"), in which case the provisions of the MPL or the GPL are * applicable instead of those above. If you wish to allow use of your * version of this file only under the terms of one of those two * licenses (the MPL or the GPL) and not to allow others to use your * version of this file under the LGPL, indicate your decision by * deletingthe provisions above and replace them with the notice and * other provisions required by the MPL or the GPL, as the case may be. * If you do not delete the provisions above, a recipient may use your * version of this file under any of the LGPL, the MPL or the GPL. * Copyright 2006-2008 the V8 project authors. All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #include "third_party/blink/renderer/platform/wtf/date_math.h" #include <limits.h> #include <math.h> #include <stdlib.h> #include <time.h> #include <unicode/basictz.h> #include <unicode/timezone.h> #include <algorithm> #include <limits> #include <memory> #include "build/build_config.h" #include "third_party/blink/renderer/platform/wtf/math_extras.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #if BUILDFLAG(IS_WIN) #include <windows.h> #else #include <sys/time.h> #endif namespace WTF { /* Constants */ static const double kHoursPerDay = …; static const double kMinimumECMADateInMs = …; static const double kMaximumECMADateInMs = …; // Day of year for the first day of each month, where index 0 is January, and // day 0 is January 1. First for non-leap years, then for leap years. static const int kFirstDayOfMonth[2][12] = …; bool IsLeapYear(int year) { … } static inline int DaysInYear(int year) { … } static inline double DaysFrom1970ToYear(int year) { … } static double MsToDays(double ms) { … } int MsToYear(double ms) { … } int DayInYear(double ms, int year) { … } int MonthFromDayInYear(int day_in_year, bool leap_year) { … } static inline bool CheckMonth(int day_in_year, int& start_day_of_this_month, int& start_day_of_next_month, int days_in_this_month) { … } int DayInMonthFromDayInYear(int day_in_year, bool leap_year) { … } int DayInYear(int year, int month, int day) { … } double DateToDaysFrom1970(int year, int month, int day) { … } static inline double YmdhmsToSeconds(int year, int64_t mon, int64_t day, int64_t hour, int64_t minute, double second) { … } // We follow the recommendation of RFC 2822 to consider all // obsolete time zones not listed here equivalent to "-0000". static const struct KnownZone { … } known_zones[] = …; inline static void SkipSpacesAndComments(const char*& s) { … } // returns 0-11 (Jan-Dec); -1 on failure static int FindMonth(const char* month_str) { … } static bool ParseInt(const char* string, char** stop_position, int base, int* result) { … } static bool ParseInt64(const char* string, char** stop_position, int base, int64_t* result) { … } // Odd case where 'exec' is allowed to be 0, to accommodate a caller in WebCore. static double ParseDateFromNullTerminatedCharacters(const char* date_string, bool& have_tz, int& offset) { … } std::optional<base::Time> ParseDateFromNullTerminatedCharacters( const char* date_string) { … } base::TimeDelta ConvertToLocalTime(base::Time time) { … } } // namespace WTF