Merge "Expose pthread_mutex_lock_timeout_np to the NDK."
diff --git a/benchmarks/string_benchmark.cpp b/benchmarks/string_benchmark.cpp
index 41306db..aa1e8c9 100644
--- a/benchmarks/string_benchmark.cpp
+++ b/benchmarks/string_benchmark.cpp
@@ -58,19 +58,42 @@
}
BENCHMARK(BM_string_memcpy)->AT_COMMON_SIZES;
-static void BM_string_memmove(benchmark::State& state) {
+static void BM_string_memmove_non_overlapping(benchmark::State& state) {
const size_t nbytes = state.range(0);
- char* buf = new char[nbytes + 64];
- memset(buf, 'x', nbytes + 64);
+ std::vector<char> src(nbytes, 'x');
+ std::vector<char> dst(nbytes, 'x');
while (state.KeepRunning()) {
- memmove(buf, buf + 1, nbytes); // Worst-case overlap.
+ memmove(dst.data(), src.data(), nbytes);
}
state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
- delete[] buf;
}
-BENCHMARK(BM_string_memmove)->AT_COMMON_SIZES;
+BENCHMARK(BM_string_memmove_non_overlapping)->AT_COMMON_SIZES;
+
+static void BM_string_memmove_overlap_dst_before_src(benchmark::State& state) {
+ const size_t nbytes = state.range(0);
+ std::vector<char> buf(nbytes + 1, 'x');
+
+ while (state.KeepRunning()) {
+ memmove(buf.data(), buf.data() + 1, nbytes); // Worst-case overlap.
+ }
+
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
+}
+BENCHMARK(BM_string_memmove_overlap_dst_before_src)->AT_COMMON_SIZES;
+
+static void BM_string_memmove_overlap_src_before_dst(benchmark::State& state) {
+ const size_t nbytes = state.range(0);
+ std::vector<char> buf(nbytes + 1, 'x');
+
+ while (state.KeepRunning()) {
+ memmove(buf.data() + 1, buf.data(), nbytes); // Worst-case overlap.
+ }
+
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
+}
+BENCHMARK(BM_string_memmove_overlap_src_before_dst)->AT_COMMON_SIZES;
static void BM_string_memset(benchmark::State& state) {
const size_t nbytes = state.range(0);
diff --git a/libc/NOTICE b/libc/NOTICE
index fcc3c85..82df90a 100644
--- a/libc/NOTICE
+++ b/libc/NOTICE
@@ -110,25 +110,6 @@
-------------------------------------------------------------------
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-Copyright 2006, The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--------------------------------------------------------------------
-
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
diff --git a/libc/bionic/__errno.cpp b/libc/bionic/__errno.cpp
index c9c1605..32e7a52 100644
--- a/libc/bionic/__errno.cpp
+++ b/libc/bionic/__errno.cpp
@@ -31,6 +31,6 @@
#include "private/bionic_tls.h"
-volatile int* __errno() {
+int* __errno() {
return reinterpret_cast<int*>(&(__get_tls()[TLS_SLOT_ERRNO]));
}
diff --git a/libc/include/android/legacy_signal_inlines.h b/libc/include/android/legacy_signal_inlines.h
index a5d3a6f..09db2a6 100644
--- a/libc/include/android/legacy_signal_inlines.h
+++ b/libc/include/android/legacy_signal_inlines.h
@@ -37,10 +37,10 @@
__BEGIN_DECLS
-sighandler_t bsd_signal(int signum, sighandler_t handler) __REMOVED_IN(21);
-
#if __ANDROID_API__ < __ANDROID_API_L__
+sighandler_t bsd_signal(int signum, sighandler_t handler) __REMOVED_IN(21);
+
/* These weren't introduced until L. */
int __libc_current_sigrtmax() __attribute__((__weak__)) __VERSIONER_NO_GUARD;
int __libc_current_sigrtmin() __attribute__((__weak__)) __VERSIONER_NO_GUARD;
diff --git a/libc/include/errno.h b/libc/include/errno.h
index 3f4cff9..cbe67fa 100644
--- a/libc/include/errno.h
+++ b/libc/include/errno.h
@@ -25,6 +25,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#ifndef _ERRNO_H
#define _ERRNO_H
@@ -33,18 +34,13 @@
__BEGIN_DECLS
-/* on Linux, ENOTSUP and EOPNOTSUPP are defined as the same error code
- * even if 1000.3 states that they should be different
- */
-#ifndef ENOTSUP
-#define ENOTSUP EOPNOTSUPP
+/* On Linux, ENOTSUP and EOPNOTSUPP are the same despite POSIX saying they should be distinct. */
+#ifndef ENOTSUP
+#define ENOTSUP EOPNOTSUPP
#endif
-/* internal function returning the address of the thread-specific errno */
-volatile int* __errno(void) __attribute_const__;
-
-/* a macro expanding to the errno l-value */
-#define errno (*__errno())
+int* __errno(void) __attribute_const__;
+#define errno (*__errno())
__END_DECLS
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 004c6b5..d62206d 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -303,13 +303,23 @@
#define __pass_object_size __pass_object_size_n(__bos_level)
#define __pass_object_size0 __pass_object_size_n(0)
-/* Used to support clangisms with FORTIFY. This isn't in the FORTIFY section
- * because these change how symbols are emitted. The linker must be kept happy.
+/*
+ * Used to support clangisms with FORTIFY. Because these change how symbols are
+ * emitted, we need to ensure that bionic itself is built fortified. But lots
+ * of external code (especially stuff using configure) likes to declare
+ * functions directly, and they can't know that the overloadable attribute
+ * exists. This leads to errors like:
+ *
+ * dcigettext.c:151:7: error: redeclaration of 'getcwd' must have the 'overloadable' attribute
+ * char *getcwd ();
+ * ^
+ *
+ * To avoid this and keep such software building, don't use overloadable if
+ * we're not using fortify.
*/
-#ifdef __clang__
+#if defined(__clang__) && defined(__BIONIC_FORTIFY)
# define __overloadable __attribute__((overloadable))
-// Don't use __RENAME directly because on gcc, this could result in a number of
-// unnecessary renames.
+/* We don't use __RENAME directly because on gcc this could result in unnecessary renames. */
# define __RENAME_CLANG(x) __RENAME(x)
#else
# define __overloadable
diff --git a/libc/include/sys/mtio.h b/libc/include/sys/mtio.h
new file mode 100644
index 0000000..8fb5655
--- /dev/null
+++ b/libc/include/sys/mtio.h
@@ -0,0 +1 @@
+#include <linux/mtio.h>
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/qsort.c b/libc/upstream-freebsd/lib/libc/stdlib/qsort.c
index 93e22cd..1ccc518 100644
--- a/libc/upstream-freebsd/lib/libc/stdlib/qsort.c
+++ b/libc/upstream-freebsd/lib/libc/stdlib/qsort.c
@@ -41,47 +41,53 @@
typedef int cmp_t(const void *, const void *);
#endif
static inline char *med3(char *, char *, char *, cmp_t *, void *);
-static inline void swapfunc(char *, char *, int, int);
+static inline void swapfunc(char *, char *, size_t, int, int);
-#define min(a, b) (a) < (b) ? a : b
+#define MIN(a, b) ((a) < (b) ? a : b)
/*
* Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
*/
-#define swapcode(TYPE, parmi, parmj, n) { \
- long i = (n) / sizeof (TYPE); \
- TYPE *pi = (TYPE *) (parmi); \
- TYPE *pj = (TYPE *) (parmj); \
+#define swapcode(TYPE, parmi, parmj, n) { \
+ size_t i = (n) / sizeof (TYPE); \
+ TYPE *pi = (TYPE *) (parmi); \
+ TYPE *pj = (TYPE *) (parmj); \
do { \
TYPE t = *pi; \
*pi++ = *pj; \
*pj++ = t; \
- } while (--i > 0); \
+ } while (--i > 0); \
}
-#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
- es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
+#define SWAPINIT(TYPE, a, es) swaptype_ ## TYPE = \
+ ((char *)a - (char *)0) % sizeof(TYPE) || \
+ es % sizeof(TYPE) ? 2 : es == sizeof(TYPE) ? 0 : 1;
static inline void
-swapfunc(a, b, n, swaptype)
- char *a, *b;
- int n, swaptype;
+swapfunc(char *a, char *b, size_t n, int swaptype_long, int swaptype_int)
{
- if(swaptype <= 1)
+ if (swaptype_long <= 1)
swapcode(long, a, b, n)
+ else if (swaptype_int <= 1)
+ swapcode(int, a, b, n)
else
swapcode(char, a, b, n)
}
-#define swap(a, b) \
- if (swaptype == 0) { \
+#define swap(a, b) \
+ if (swaptype_long == 0) { \
long t = *(long *)(a); \
*(long *)(a) = *(long *)(b); \
*(long *)(b) = t; \
+ } else if (swaptype_int == 0) { \
+ int t = *(int *)(a); \
+ *(int *)(a) = *(int *)(b); \
+ *(int *)(b) = t; \
} else \
- swapfunc(a, b, es, swaptype)
+ swapfunc(a, b, es, swaptype_long, swaptype_int)
-#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
+#define vecswap(a, b, n) \
+ if ((n) > 0) swapfunc(a, b, n, swaptype_long, swaptype_int)
#ifdef I_AM_QSORT_R
#define CMP(t, x, y) (cmp((t), (x), (y)))
@@ -98,24 +104,25 @@
{
return CMP(thunk, a, b) < 0 ?
(CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a ))
- :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c ));
+ :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c ));
}
#ifdef I_AM_QSORT_R
void
qsort_r(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp)
#else
-#define thunk NULL
+#define thunk NULL
void
qsort(void *a, size_t n, size_t es, cmp_t *cmp)
#endif
{
char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
- size_t d, r;
+ size_t d1, d2;
int cmp_result;
- int swaptype, swap_cnt;
+ int swaptype_long, swaptype_int, swap_cnt;
-loop: SWAPINIT(a, es);
+loop: SWAPINIT(long, a, es);
+ SWAPINIT(int, a, es);
swap_cnt = 0;
if (n < 7) {
for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
@@ -130,7 +137,8 @@
pl = a;
pn = (char *)a + (n - 1) * es;
if (n > 40) {
- d = (n / 8) * es;
+ size_t d = (n / 8) * es;
+
pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk);
pm = med3(pm - d, pm, pm + d, cmp, thunk);
pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk);
@@ -175,21 +183,43 @@
}
pn = (char *)a + n * es;
- r = min(pa - (char *)a, pb - pa);
- vecswap(a, pb - r, r);
- r = min(pd - pc, pn - pd - es);
- vecswap(pb, pn - r, r);
- if ((r = pb - pa) > es)
+ d1 = MIN(pa - (char *)a, pb - pa);
+ vecswap(a, pb - d1, d1);
+ d1 = MIN(pd - pc, pn - pd - es);
+ vecswap(pb, pn - d1, d1);
+
+ d1 = pb - pa;
+ d2 = pd - pc;
+ if (d1 <= d2) {
+ /* Recurse on left partition, then iterate on right partition */
+ if (d1 > es) {
#ifdef I_AM_QSORT_R
- qsort_r(a, r / es, es, thunk, cmp);
+ qsort_r(a, d1 / es, es, thunk, cmp);
#else
- qsort(a, r / es, es, cmp);
+ qsort(a, d1 / es, es, cmp);
#endif
- if ((r = pd - pc) > es) {
- /* Iterate rather than recurse to save stack space */
- a = pn - r;
- n = r / es;
- goto loop;
+ }
+ if (d2 > es) {
+ /* Iterate rather than recurse to save stack space */
+ /* qsort(pn - d2, d2 / es, es, cmp); */
+ a = pn - d2;
+ n = d2 / es;
+ goto loop;
+ }
+ } else {
+ /* Recurse on right partition, then iterate on left partition */
+ if (d2 > es) {
+#ifdef I_AM_QSORT_R
+ qsort_r(pn - d2, d2 / es, es, thunk, cmp);
+#else
+ qsort(pn - d2, d2 / es, es, cmp);
+#endif
+ }
+ if (d1 > es) {
+ /* Iterate rather than recurse to save stack space */
+ /* qsort(a, d1 / es, es, cmp); */
+ n = d1 / es;
+ goto loop;
+ }
}
-/* qsort(pn - r, r / es, es, cmp);*/
}
diff --git a/libc/zoneinfo/Android.mk b/libc/zoneinfo/Android.mk
deleted file mode 100644
index faa1f06..0000000
--- a/libc/zoneinfo/Android.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tzdata
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT)/usr/share/zoneinfo
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tzlookup.xml
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT)/usr/share/zoneinfo
-include $(BUILD_PREBUILT)
-
-# The host build doesn't use bionic, but it does use bionic's zoneinfo data
-ifeq ($(WITH_HOST_DALVIK),true)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tzdata-host
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_IS_HOST_MODULE := true
-LOCAL_SRC_FILES := tzdata
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_STEM := $(LOCAL_SRC_FILES)
-LOCAL_MODULE_PATH := $(HOST_OUT)/usr/share/zoneinfo
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := tzlookup.xml-host
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_IS_HOST_MODULE := true
-LOCAL_SRC_FILES := tzlookup.xml
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_STEM := $(LOCAL_SRC_FILES)
-LOCAL_MODULE_PATH := $(HOST_OUT)/usr/share/zoneinfo
-include $(BUILD_PREBUILT)
-
-endif
diff --git a/libc/zoneinfo/MODULE_LICENSE_PUBLIC_DOMAIN b/libc/zoneinfo/MODULE_LICENSE_PUBLIC_DOMAIN
deleted file mode 100644
index e69de29..0000000
--- a/libc/zoneinfo/MODULE_LICENSE_PUBLIC_DOMAIN
+++ /dev/null
diff --git a/libc/zoneinfo/tzdata b/libc/zoneinfo/tzdata
deleted file mode 100644
index c5932bc..0000000
--- a/libc/zoneinfo/tzdata
+++ /dev/null
Binary files differ
diff --git a/libc/zoneinfo/tzlookup.xml b/libc/zoneinfo/tzlookup.xml
deleted file mode 100644
index 5846f50..0000000
--- a/libc/zoneinfo/tzlookup.xml
+++ /dev/null
@@ -1,1622 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<timezones>
- <!-- Time zones by country.
-
- Data in this file originates from IANA's zone.tab file.
- The ordering of zones within each country is Android-specific and
- affects Android behavior, see below for details.
-
- The ordering of country elements is not important but is kept in ASCII
- order by code for easier maintenance. There must only be one country
- element per unique code. The code attribute is the (lower cased)
- ISO 3166 2-character country code used in the IANA zones.tab file.
-
- The <id> entries contain the IANA IDs for time zones used in a
- country.
-
- The file is used when picking a time zone for an Android device given
- a known local time, offset from UTC and whether the local zone is
- currently observing DST.
-
- The ordering of <id> elements is important because it influence the
- order that time zones in a country are considered.
-
- Currently the <id> entries are mostly primarily ordered by raw (non-DST)
- offset and then "desirability". This ordering is an historical artifact
- that is likely to change in future.
-
- The most sensible ordering for <id> entries for a country is by
- population of users that observe the time zone to maximize the
- probability of matching an arbitrary user. Then:
-
- The first <id> entry for a given country should have the highest
- likelihood of matching the user's needs when only the user's country
- code is available.
-
- The first zone that matches a user's country, offset and DST state
- should have the highest likelihood of matching the user's needs when
- country code, offset and DST state are available.
- -->
- <countryzones>
-
- <!-- ANDORRA, 1:00 -->
- <country code="ad">
- <id>Europe/Andorra</id>
- </country>
-
- <!-- UNITED ARAB EMIRATES, 4:00 -->
- <country code="ae">
- <id>Asia/Dubai</id>
- </country>
-
- <!-- AFGHANISTAN, 4:30 -->
- <country code="af">
- <id>Asia/Kabul</id>
- </country>
-
- <!-- ANTIGUA AND BARBUDA, -4:00 -->
- <country code="ag">
- <id>America/Antigua</id>
- </country>
-
- <!-- ANGUILLA, -4:00 -->
- <country code="ai">
- <id>America/Anguilla</id>
- </country>
-
- <!-- ALBANIA, 1:00 -->
- <country code="al">
- <id>Europe/Tirane</id>
- </country>
-
- <!-- ARMENIA, 4:00 -->
- <country code="am">
- <id>Asia/Yerevan</id>
- </country>
-
- <!-- ANGOLA, 1:00 -->
- <country code="ao">
- <id>Africa/Luanda</id>
- </country>
-
- <!-- ANTARCTICA -->
- <country code="aq">
- <!-- 12:00 -->
- <id>Antarctica/McMurdo</id>
-
- <!-- 10:00 -->
- <id>Antarctica/DumontDUrville</id>
-
- <!-- 8:00 -->
- <id>Antarctica/Casey</id>
-
- <!-- 7:00 -->
- <id>Antarctica/Davis</id>
-
- <!-- 5:00 -->
- <id>Antarctica/Mawson</id>
-
- <!-- 6:00 -->
- <id>Antarctica/Vostok</id>
-
- <!-- 3:00 -->
- <id>Antarctica/Syowa</id>
-
- <!-- 0:00 -->
- <id>Antarctica/Troll</id>
-
- <!-- -3:00 -->
- <id>Antarctica/Rothera</id>
-
- <!-- -4:00 -->
- <id>Antarctica/Palmer</id>
- </country>
-
- <!-- ARGENTINA, -3:00 -->
- <country code="ar">
- <id>America/Argentina/Buenos_Aires</id>
- <id>America/Argentina/Cordoba</id>
- <id>America/Argentina/Salta</id>
- <id>America/Argentina/Jujuy</id>
- <id>America/Argentina/Tucuman</id>
- <id>America/Argentina/Catamarca</id>
- <id>America/Argentina/La_Rioja</id>
- <id>America/Argentina/San_Juan</id>
- <id>America/Argentina/Mendoza</id>
- <id>America/Argentina/San_Luis</id>
- <id>America/Argentina/Rio_Gallegos</id>
- <id>America/Argentina/Ushuaia</id>
- </country>
-
- <!-- AMERICAN SAMOA, -11:00 -->
- <country code="as">
- <id>Pacific/Pago_Pago</id>
- </country>
-
- <!-- AUSTRIA, 1:00 -->
- <country code="at">
- <id>Europe/Vienna</id>
- </country>
-
- <!-- AUSTRALIA -->
- <country code="au">
- <!-- 10:00 -->
- <id>Australia/Sydney</id>
- <id>Australia/Melbourne</id>
- <id>Australia/Brisbane</id>
- <id>Australia/Hobart</id>
- <id>Australia/Currie</id>
- <id>Australia/Lindeman</id>
-
- <!-- 11:00 -->
- <id>Antarctica/Macquarie</id>
-
- <!-- 10:30 -->
- <id>Australia/Lord_Howe</id>
-
- <!-- 9:30 -->
- <id>Australia/Adelaide</id>
- <id>Australia/Broken_Hill</id>
- <id>Australia/Darwin</id>
-
- <!-- 8:00 -->
- <id>Australia/Perth</id>
-
- <!-- 8:45 -->
- <id>Australia/Eucla</id>
- </country>
-
- <!-- ARUBA, -4:00 -->
- <country code="aw">
- <id>America/Aruba</id>
- </country>
-
- <!-- ALAND ISLANDS, 2:00 -->
- <country code="ax">
- <id>Europe/Mariehamn</id>
- </country>
-
- <!-- AZERBAIJAN, 4:00 -->
- <country code="az">
- <id>Asia/Baku</id>
- </country>
-
- <!-- BOSNIA AND HERZEGOVINA, 1:00 -->
- <country code="ba">
- <id>Europe/Sarajevo</id>
- </country>
-
- <!-- BARBADOS, -4:00 -->
- <country code="bb">
- <id>America/Barbados</id>
- </country>
-
- <!-- BANGLADESH, 6:00 -->
- <country code="bd">
- <id>Asia/Dhaka</id>
- </country>
-
- <!-- BELGIUM, 1:00 -->
- <country code="be">
- <id>Europe/Brussels</id>
- </country>
-
- <!-- BURKINA FASO, 0:00 -->
- <country code="bf">
- <id>Africa/Ouagadougou</id>
- </country>
-
- <!-- BULGARIA, 2:00 -->
- <country code="bg">
- <id>Europe/Sofia</id>
- </country>
-
- <!-- BAHRAIN, 3:00 -->
- <country code="bh">
- <id>Asia/Bahrain</id>
- </country>
-
- <!-- BURUNDI, 2:00 -->
- <country code="bi">
- <id>Africa/Bujumbura</id>
- </country>
-
- <!-- BENIN, 1:00 -->
- <country code="bj">
- <id>Africa/Porto-Novo</id>
- </country>
-
- <!-- Saint Barthélemy, -4:00 -->
- <country code="bl">
- <id>America/St_Barthelemy</id>
- </country>
-
- <!-- BERMUDA, -4:00 -->
- <country code="bm">
- <id>Atlantic/Bermuda</id>
- </country>
-
- <!-- BRUNEI DARUSSALAM, 8:00 -->
- <country code="bn">
- <id>Asia/Brunei</id>
- </country>
-
- <!-- BOLIVIA, -4:00 -->
- <country code="bo">
- <id>America/La_Paz</id>
- </country>
-
- <!-- Caribbean Netherlands, -4:00 -->
- <country code="bq">
- <id>America/Kralendijk</id>
- </country>
-
- <!-- BRAZIL -->
- <country code="br">
- <!-- -2:00 -->
- <id>America/Noronha</id>
-
- <!-- -3:00 -->
- <id>America/Sao_Paulo</id>
- <id>America/Belem</id>
- <id>America/Fortaleza</id>
- <id>America/Recife</id>
- <id>America/Araguaina</id>
- <id>America/Maceio</id>
- <id>America/Bahia</id>
- <id>America/Santarem</id>
-
- <!-- -4:00 -->
- <id>America/Manaus</id>
- <id>America/Campo_Grande</id>
- <id>America/Cuiaba</id>
- <id>America/Porto_Velho</id>
- <id>America/Boa_Vista</id>
-
- <!-- -5:00 -->
- <id>America/Eirunepe</id>
- <id>America/Rio_Branco</id>
- </country>
-
- <!-- BAHAMAS, -5:00 -->
- <country code="bs">
- <id>America/Nassau</id>
- </country>
-
- <!-- BHUTAN, 6:00 -->
- <country code="bt">
- <id>Asia/Thimphu</id>
- </country>
-
- <!-- BOTSWANA, 2:00 -->
- <country code="bw">
- <id>Africa/Gaborone</id>
- </country>
-
- <!-- BELARUS, 3:00 -->
- <country code="by">
- <id>Europe/Minsk</id>
- </country>
-
- <!-- BELIZE, -6:00 -->
- <country code="bz">
- <id>America/Belize</id>
- </country>
-
- <!-- CANADA -->
- <country code="ca">
- <!-- -3:30 -->
- <id>America/St_Johns</id>
-
- <!-- -4:00 -->
- <id>America/Halifax</id>
- <id>America/Glace_Bay</id>
- <id>America/Moncton</id>
- <id>America/Goose_Bay</id>
- <id>America/Blanc-Sablon</id>
-
- <!-- -5:00 -->
- <id>America/Toronto</id>
- <id>America/Nipigon</id>
- <id>America/Thunder_Bay</id>
- <id>America/Iqaluit</id>
- <id>America/Pangnirtung</id>
- <id>America/Atikokan</id>
-
- <!-- -6:00 -->
- <id>America/Winnipeg</id>
- <id>America/Regina</id>
- <id>America/Rankin_Inlet</id>
- <id>America/Rainy_River</id>
- <id>America/Swift_Current</id>
- <id>America/Resolute</id>
-
- <!-- -7:00 -->
- <id>America/Edmonton</id>
- <id>America/Cambridge_Bay</id>
- <id>America/Yellowknife</id>
- <id>America/Inuvik</id>
- <id>America/Dawson_Creek</id>
- <id>America/Creston</id>
- <id>America/Fort_Nelson</id>
-
- <!-- -8:00 -->
- <id>America/Vancouver</id>
- <id>America/Whitehorse</id>
- <id>America/Dawson</id>
- </country>
-
- <!-- COCOS (KEELING) ISLANDS, 6:30 -->
- <country code="cc">
- <id>Indian/Cocos</id>
- </country>
-
- <!-- CONGO, THE DEMOCRATIC REPUBLIC OF THE -->
- <country code="cd">
- <!-- 2:00 -->
- <id>Africa/Lubumbashi</id>
-
- <!-- 1:00 -->
- <id>Africa/Kinshasa</id>
- </country>
-
- <!-- CENTRAL AFRICAN REPUBLIC, 1:00 -->
- <country code="cf">
- <id>Africa/Bangui</id>
- </country>
-
- <!-- CONGO, 1:00 -->
- <country code="cg">
- <id>Africa/Brazzaville</id>
- </country>
-
- <!-- SWITZERLAND, 1:00 -->
- <country code="ch">
- <id>Europe/Zurich</id>
- </country>
-
- <!-- COTE D'IVOIRE, 0:00 -->
- <country code="ci">
- <id>Africa/Abidjan</id>
- </country>
-
- <!-- COOK ISLANDS, -10:00 -->
- <country code="ck">
- <id>Pacific/Rarotonga</id>
- </country>
-
- <!-- CHILE -->
- <country code="cl">
- <!-- -3:00 -->
- <id>America/Punta_Arenas</id>
-
- <!-- -4:00 -->
- <id>America/Santiago</id>
-
- <!-- -6:00 -->
- <id>Pacific/Easter</id>
- </country>
-
- <!-- CAMEROON, 1:00 -->
- <country code="cm">
- <id>Africa/Douala</id>
- </country>
-
- <!-- CHINA -->
- <country code="cn">
- <!-- 8:00 -->
- <id>Asia/Shanghai</id>
-
- <!-- 6:00 -->
- <id>Asia/Urumqi</id>
- </country>
-
- <!-- COLOMBIA, -5:00 -->
- <country code="co">
- <id>America/Bogota</id>
- </country>
-
- <!-- COSTA RICA, -6:00 -->
- <country code="cr">
- <id>America/Costa_Rica</id>
- </country>
-
- <!-- CUBA, -5:00 -->
- <country code="cu">
- <id>America/Havana</id>
- </country>
-
- <!-- CAPE VERDE, -1:00 -->
- <country code="cv">
- <id>Atlantic/Cape_Verde</id>
- </country>
-
- <!-- Curaçao, -4:00 -->
- <country code="cw">
- <id>America/Curacao</id>
- </country>
-
- <!-- CHRISTMAS ISLAND, 7:00 -->
- <country code="cx">
- <id>Indian/Christmas</id>
- </country>
-
- <!-- CYPRUS -->
- <country code="cy">
- <!-- 2:00 -->
- <id>Asia/Nicosia</id>
-
- <!-- 3:00 -->
- <id>Asia/Famagusta</id>
- </country>
-
- <!-- CZECH REPUBLIC, 1:00 -->
- <country code="cz">
- <id>Europe/Prague</id>
- </country>
-
- <!-- GERMANY, 1:00 -->
- <country code="de">
- <id>Europe/Berlin</id>
- <id>Europe/Busingen</id>
- </country>
-
- <!-- DJIBOUTI, 3:00 -->
- <country code="dj">
- <id>Africa/Djibouti</id>
- </country>
-
- <!-- DENMARK, 1:00 -->
- <country code="dk">
- <id>Europe/Copenhagen</id>
- </country>
-
- <!-- DOMINICA, -4:00 -->
- <country code="dm">
- <id>America/Dominica</id>
- </country>
-
- <!-- DOMINICAN REPUBLIC, -4:00 -->
- <country code="do">
- <id>America/Santo_Domingo</id>
- </country>
-
- <!-- ALGERIA, 1:00 -->
- <country code="dz">
- <id>Africa/Algiers</id>
- </country>
-
- <!-- ECUADOR -->
- <country code="ec">
- <!-- -5:00 -->
- <id>America/Guayaquil</id>
-
- <!-- -6:00 -->
- <id>Pacific/Galapagos</id>
- </country>
-
- <!-- ESTONIA, 2:00 -->
- <country code="ee">
- <id>Europe/Tallinn</id>
- </country>
-
- <!-- EGYPT, 2:00 -->
- <country code="eg">
- <id>Africa/Cairo</id>
- </country>
-
- <!-- WESTERN SAHARA, 0:00 -->
- <country code="eh">
- <id>Africa/El_Aaiun</id>
- </country>
-
- <!-- ERITREA, 3:00 -->
- <country code="er">
- <id>Africa/Asmara</id>
- </country>
-
- <!-- SPAIN -->
- <country code="es">
- <!-- 1:00 -->
- <id>Europe/Madrid</id>
- <id>Africa/Ceuta</id>
-
- <!-- 0:00 -->
- <id>Atlantic/Canary</id>
- </country>
-
- <!-- ETHIOPIA, 3:00 -->
- <country code="et">
- <id>Africa/Addis_Ababa</id>
- </country>
-
- <!-- FINLAND, 2:00 -->
- <country code="fi">
- <id>Europe/Helsinki</id>
- </country>
-
- <!-- FIJI, 12:00 -->
- <country code="fj">
- <id>Pacific/Fiji</id>
- </country>
-
- <!-- FALKLAND ISLANDS (MALVINAS), -3:00 -->
- <country code="fk">
- <id>Atlantic/Stanley</id>
- </country>
-
- <!-- MICRONESIA, FEDERATED STATES OF -->
- <country code="fm">
- <!-- 11:00 -->
- <id>Pacific/Pohnpei</id>
- <id>Pacific/Kosrae</id>
-
- <!-- 10:00 -->
- <id>Pacific/Chuuk</id>
- </country>
-
- <!-- FAROE ISLANDS, 0:00 -->
- <country code="fo">
- <id>Atlantic/Faroe</id>
- </country>
-
- <!-- FRANCE, 1:00 -->
- <country code="fr">
- <id>Europe/Paris</id>
- </country>
-
- <!-- GABON, 1:00 -->
- <country code="ga">
- <id>Africa/Libreville</id>
- </country>
-
- <!-- UNITED KINGDOM, 0:00 -->
- <country code="gb">
- <id>Europe/London</id>
- </country>
-
- <!-- GRENADA, -4:00 -->
- <country code="gd">
- <id>America/Grenada</id>
- </country>
-
- <!-- GEORGIA, 4:00 -->
- <country code="ge">
- <id>Asia/Tbilisi</id>
- </country>
-
- <!-- FRENCH GUIANA, -3:00 -->
- <country code="gf">
- <id>America/Cayenne</id>
- </country>
-
- <!-- GUERNSEY, 0:00 -->
- <country code="gg">
- <id>Europe/Guernsey</id>
- </country>
-
- <!-- GHANA, 0:00 -->
- <country code="gh">
- <id>Africa/Accra</id>
- </country>
-
- <!-- GIBRALTAR, 1:00 -->
- <country code="gi">
- <id>Europe/Gibraltar</id>
- </country>
-
- <!-- GREENLAND -->
- <country code="gl">
- <!-- 0:00 -->
- <id>America/Danmarkshavn</id>
-
- <!-- -1:00 -->
- <id>America/Scoresbysund</id>
-
- <!-- -3:00 -->
- <id>America/Godthab</id>
-
- <!-- -4:00 -->
- <id>America/Thule</id>
- </country>
-
- <!-- GAMBIA, 0:00 -->
- <country code="gm">
- <id>Africa/Banjul</id>
- </country>
-
- <!-- GUINEA, 0:00 -->
- <country code="gn">
- <id>Africa/Conakry</id>
- </country>
-
- <!-- GUADELOUPE, -4:00 -->
- <country code="gp">
- <id>America/Guadeloupe</id>
- </country>
-
- <!-- EQUATORIAL GUINEA, 1:00 -->
- <country code="gq">
- <id>Africa/Malabo</id>
- </country>
-
- <!-- GREECE, 2:00 -->
- <country code="gr">
- <id>Europe/Athens</id>
- </country>
-
- <!-- SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS, -2:00 -->
- <country code="gs">
- <id>Atlantic/South_Georgia</id>
- </country>
-
- <!-- GUATEMALA, -6:00 -->
- <country code="gt">
- <id>America/Guatemala</id>
- </country>
-
- <!-- GUAM, 10:00 -->
- <country code="gu">
- <id>Pacific/Guam</id>
- </country>
-
- <!-- GUINEA-BISSAU, 0:00 -->
- <country code="gw">
- <id>Africa/Bissau</id>
- </country>
-
- <!-- GUYANA, -4:00 -->
- <country code="gy">
- <id>America/Guyana</id>
- </country>
-
- <!-- HONG KONG, 8:00 -->
- <country code="hk">
- <id>Asia/Hong_Kong</id>
- </country>
-
- <!-- HONDURAS, -6:00 -->
- <country code="hn">
- <id>America/Tegucigalpa</id>
- </country>
-
- <!-- CROATIA, 1:00 -->
- <country code="hr">
- <id>Europe/Zagreb</id>
- </country>
-
- <!-- HAITI, -5:00 -->
- <country code="ht">
- <id>America/Port-au-Prince</id>
- </country>
-
- <!-- HUNGARY, 1:00 -->
- <country code="hu">
- <id>Europe/Budapest</id>
- </country>
-
- <!-- INDONESIA -->
- <country code="id">
- <!-- 9:00 -->
- <id>Asia/Jayapura</id>
-
- <!-- 8:00 -->
- <id>Asia/Makassar</id>
-
- <!-- 7:00 -->
- <id>Asia/Jakarta</id>
- <id>Asia/Pontianak</id>
- </country>
-
- <!-- IRELAND, 0:00 -->
- <country code="ie">
- <id>Europe/Dublin</id>
- </country>
-
- <!-- ISRAEL, 2:00 -->
- <country code="il">
- <id>Asia/Jerusalem</id>
- </country>
-
- <!-- ISLE OF MAN, 0:00 -->
- <country code="im">
- <id>Europe/Isle_of_Man</id>
- </country>
-
- <!-- INDIA, 5:30 -->
- <country code="in">
- <id>Asia/Kolkata</id>
- </country>
-
- <!-- BRITISH INDIAN OCEAN TERRITORY, 6:00 -->
- <country code="io">
- <id>Indian/Chagos</id>
- </country>
-
- <!-- IRAQ, 3:00 -->
- <country code="iq">
- <id>Asia/Baghdad</id>
- </country>
-
- <!-- IRAN, ISLAMIC REPUBLIC OF, 3:30 -->
- <country code="ir">
- <id>Asia/Tehran</id>
- </country>
-
- <!-- ICELAND, 0:00 -->
- <country code="is">
- <id>Atlantic/Reykjavik</id>
- </country>
-
- <!-- ITALY, 1:00 -->
- <country code="it">
- <id>Europe/Rome</id>
- </country>
-
- <!-- JERSEY, 0:00 -->
- <country code="je">
- <id>Europe/Jersey</id>
- </country>
-
- <!-- JAMAICA, -5:00 -->
- <country code="jm">
- <id>America/Jamaica</id>
- </country>
-
- <!-- JORDAN, 2:00 -->
- <country code="jo">
- <id>Asia/Amman</id>
- </country>
-
- <!-- JAPAN, 9:00 -->
- <country code="jp">
- <id>Asia/Tokyo</id>
- </country>
-
- <!-- KENYA, 3:00 -->
- <country code="ke">
- <id>Africa/Nairobi</id>
- </country>
-
- <!-- KYRGYZSTAN, 6:00 -->
- <country code="kg">
- <id>Asia/Bishkek</id>
- </country>
-
- <!-- CAMBODIA, 7:00 -->
- <country code="kh">
- <id>Asia/Phnom_Penh</id>
- </country>
-
- <!-- KIRIBATI -->
- <country code="ki">
- <!-- 14:00 -->
- <id>Pacific/Kiritimati</id>
-
- <!-- 13:00 -->
- <id>Pacific/Enderbury</id>
-
- <!-- 12:00 -->
- <id>Pacific/Tarawa</id>
- </country>
-
- <!-- COMOROS, 3:00 -->
- <country code="km">
- <id>Indian/Comoro</id>
- </country>
-
- <!-- SAINT KITTS AND NEVIS, -4:00 -->
- <country code="kn">
- <id>America/St_Kitts</id>
- </country>
-
- <!-- KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF, 8:30 -->
- <country code="kp">
- <id>Asia/Pyongyang</id>
- </country>
-
- <!-- KOREA, REPUBLIC OF, 9:00 -->
- <country code="kr">
- <id>Asia/Seoul</id>
- </country>
-
- <!-- KUWAIT, 3:00 -->
- <country code="kw">
- <id>Asia/Kuwait</id>
- </country>
-
- <!-- CAYMAN ISLANDS, -5:00 -->
- <country code="ky">
- <id>America/Cayman</id>
- </country>
-
- <!-- KAZAKHSTAN -->
- <country code="kz">
- <!-- 6:00 -->
- <id>Asia/Almaty</id>
- <id>Asia/Qyzylorda</id>
-
- <!-- 5:00 -->
- <id>Asia/Aqtau</id>
- <id>Asia/Oral</id>
- <id>Asia/Aqtobe</id>
- <id>Asia/Atyrau</id>
- </country>
-
- <!-- LAO PEOPLE'S DEMOCRATIC REPUBLIC, 7:00 -->
- <country code="la">
- <id>Asia/Vientiane</id>
- </country>
-
- <!-- LEBANON, 2:00 -->
- <country code="lb">
- <id>Asia/Beirut</id>
- </country>
-
- <!-- SAINT LUCIA, -4:00 -->
- <country code="lc">
- <id>America/St_Lucia</id>
- </country>
-
- <!-- LIECHTENSTEIN, 1:00 -->
- <country code="li">
- <id>Europe/Vaduz</id>
- </country>
-
- <!-- SRI LANKA, 5:30 -->
- <country code="lk">
- <id>Asia/Colombo</id>
- </country>
-
- <!-- LIBERIA, 0:00 -->
- <country code="lr">
- <id>Africa/Monrovia</id>
- </country>
-
- <!-- LESOTHO, 2:00 -->
- <country code="ls">
- <id>Africa/Maseru</id>
- </country>
-
- <!-- LITHUANIA, 2:00 -->
- <country code="lt">
- <id>Europe/Vilnius</id>
- </country>
-
- <!-- LUXEMBOURG, 1:00 -->
- <country code="lu">
- <id>Europe/Luxembourg</id>
- </country>
-
- <!-- LATVIA, 2:00 -->
- <country code="lv">
- <id>Europe/Riga</id>
- </country>
-
- <!-- LIBYAN ARAB JAMAHIRIYA, 2:00 -->
- <country code="ly">
- <id>Africa/Tripoli</id>
- </country>
-
- <!-- MOROCCO, 0:00 -->
- <country code="ma">
- <id>Africa/Casablanca</id>
- </country>
-
- <!-- MONACO, 1:00 -->
- <country code="mc">
- <id>Europe/Monaco</id>
- </country>
-
- <!-- MOLDOVA, 2:00 -->
- <country code="md">
- <id>Europe/Chisinau</id>
- </country>
-
- <!-- MONTENEGRO, 1:00 -->
- <country code="me">
- <id>Europe/Podgorica</id>
- </country>
-
- <!-- Collectivity of Saint Martin, -4:00 -->
- <country code="mf">
- <id>America/Marigot</id>
- </country>
-
- <!-- MADAGASCAR, 3:00 -->
- <country code="mg">
- <id>Indian/Antananarivo</id>
- </country>
-
- <!-- MARSHALL ISLANDS, 12:00 -->
- <country code="mh">
- <id>Pacific/Majuro</id>
- <id>Pacific/Kwajalein</id>
- </country>
-
- <!-- MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF, 1:00 -->
- <country code="mk">
- <id>Europe/Skopje</id>
- </country>
-
- <!-- MALI, 0:00 -->
- <country code="ml">
- <id>Africa/Bamako</id>
- </country>
-
- <!-- MYANMAR, 6:30 -->
- <country code="mm">
- <id>Asia/Yangon</id>
- </country>
-
- <!-- MONGOLIA -->
- <country code="mn">
- <!-- 8:00 -->
- <id>Asia/Choibalsan</id>
- <id>Asia/Ulaanbaatar</id>
-
- <!-- 7:00 -->
- <id>Asia/Hovd</id>
- </country>
-
- <!-- MACAO, 8:00 -->
- <country code="mo">
- <id>Asia/Macau</id>
- </country>
-
- <!-- NORTHERN MARIANA ISLANDS, 10:00 -->
- <country code="mp">
- <id>Pacific/Saipan</id>
- </country>
-
- <!-- MARTINIQUE, -4:00 -->
- <country code="mq">
- <id>America/Martinique</id>
- </country>
-
- <!-- MAURITANIA, 0:00 -->
- <country code="mr">
- <id>Africa/Nouakchott</id>
- </country>
-
- <!-- MONTSERRAT, -4:00 -->
- <country code="ms">
- <id>America/Montserrat</id>
- </country>
-
- <!-- MALTA, 1:00 -->
- <country code="mt">
- <id>Europe/Malta</id>
- </country>
-
- <!-- MAURITIUS, 4:00 -->
- <country code="mu">
- <id>Indian/Mauritius</id>
- </country>
-
- <!-- MALDIVES, 5:00 -->
- <country code="mv">
- <id>Indian/Maldives</id>
- </country>
-
- <!-- MALAWI, 2:00 -->
- <country code="mw">
- <id>Africa/Blantyre</id>
- </country>
-
- <!-- MEXICO -->
- <country code="mx">
- <!-- -6:00 -->
- <id>America/Mexico_City</id>
- <id>America/Merida</id>
- <id>America/Monterrey</id>
- <id>America/Matamoros</id>
- <id>America/Bahia_Banderas</id>
-
- <!-- -5:00 -->
- <id>America/Cancun</id>
-
- <!-- -7:00 -->
- <id>America/Chihuahua</id>
- <id>America/Hermosillo</id>
- <id>America/Mazatlan</id>
- <id>America/Ojinaga</id>
-
- <!-- -8:00 -->
- <id>America/Tijuana</id>
- </country>
-
- <!-- MALAYSIA, 8:00 -->
- <country code="my">
- <id>Asia/Kuala_Lumpur</id>
- <id>Asia/Kuching</id>
- </country>
-
- <!-- MOZAMBIQUE, 2:00 -->
- <country code="mz">
- <id>Africa/Maputo</id>
- </country>
-
- <!-- NAMIBIA, 1:00 -->
- <country code="na">
- <id>Africa/Windhoek</id>
- </country>
-
- <!-- NEW CALEDONIA, 11:00 -->
- <country code="nc">
- <id>Pacific/Noumea</id>
- </country>
-
- <!-- NIGER, 1:00 -->
- <country code="ne">
- <id>Africa/Niamey</id>
- </country>
-
- <!-- NORFOLK ISLAND, 11:30 -->
- <country code="nf">
- <id>Pacific/Norfolk</id>
- </country>
-
- <!-- NIGERIA, 1:00 -->
- <country code="ng">
- <id>Africa/Lagos</id>
- </country>
-
- <!-- NICARAGUA, -6:00 -->
- <country code="ni">
- <id>America/Managua</id>
- </country>
-
- <!-- NETHERLANDS, 1:00 -->
- <country code="nl">
- <id>Europe/Amsterdam</id>
- </country>
-
- <!-- NORWAY, 1:00 -->
- <country code="no">
- <id>Europe/Oslo</id>
- </country>
-
- <!-- NEPAL, 5:45 -->
- <country code="np">
- <id>Asia/Kathmandu</id>
- </country>
-
- <!-- NAURU, 12:00 -->
- <country code="nr">
- <id>Pacific/Nauru</id>
- </country>
-
- <!-- NIUE, -11:00 -->
- <country code="nu">
- <id>Pacific/Niue</id>
- </country>
-
- <!-- NEW ZEALAND, 12:00 -->
- <country code="nz">
- <!-- 12:00 -->
- <id>Pacific/Auckland</id>
-
- <!-- 12:45 -->
- <id>Pacific/Chatham</id>
- </country>
-
- <!-- OMAN, 4:00 -->
- <country code="om">
- <id>Asia/Muscat</id>
- </country>
-
- <!-- PANAMA, -5:00 -->
- <country code="pa">
- <id>America/Panama</id>
- </country>
-
- <!-- PERU, -5:00 -->
- <country code="pe">
- <id>America/Lima</id>
- </country>
-
- <!-- FRENCH POLYNESIA -->
- <country code="pf">
- <!-- -9:00 -->
- <id>Pacific/Gambier</id>
-
- <!-- -9:30 -->
- <id>Pacific/Marquesas</id>
-
- <!-- -10:00 -->
- <id>Pacific/Tahiti</id>
- </country>
-
- <!-- PAPUA NEW GUINEA -->
- <country code="pg">
- <!-- 10:00 -->
- <id>Pacific/Port_Moresby</id>
-
- <!-- 11:00 -->
- <id>Pacific/Bougainville</id>
- </country>
-
- <!-- PHILIPPINES, 8:00 -->
- <country code="ph">
- <id>Asia/Manila</id>
- </country>
-
- <!-- PAKISTAN, 5:00 -->
- <country code="pk">
- <id>Asia/Karachi</id>
- </country>
-
- <!-- POLAND, 1:00 -->
- <country code="pl">
- <id>Europe/Warsaw</id>
- </country>
-
- <!-- SAINT PIERRE AND MIQUELON, -3:00 -->
- <country code="pm">
- <id>America/Miquelon</id>
- </country>
-
- <!-- PITCAIRN, -8:00 -->
- <country code="pn">
- <id>Pacific/Pitcairn</id>
- </country>
-
- <!-- PUERTO RICO, -4:00 -->
- <country code="pr">
- <id>America/Puerto_Rico</id>
- </country>
-
- <!-- PALESTINE, 2:00 -->
- <country code="ps">
- <id>Asia/Gaza</id>
- <id>Asia/Hebron</id>
- </country>
-
- <!-- PORTUGAL -->
- <country code="pt">
- <!-- 0:00 -->
- <id>Europe/Lisbon</id>
- <id>Atlantic/Madeira</id>
-
- <!-- -1:00 -->
- <id>Atlantic/Azores</id>
- </country>
-
- <!-- PALAU, 9:00 -->
- <country code="pw">
- <id>Pacific/Palau</id>
- </country>
-
- <!-- PARAGUAY, -4:00 -->
- <country code="py">
- <id>America/Asuncion</id>
- </country>
-
- <!-- QATAR, 3:00 -->
- <country code="qa">
- <id>Asia/Qatar</id>
- </country>
-
- <!-- REUNION, 4:00 -->
- <country code="re">
- <id>Indian/Reunion</id>
- </country>
-
- <!-- ROMANIA, 2:00 -->
- <country code="ro">
- <id>Europe/Bucharest</id>
- </country>
-
- <!-- SERBIA, 1:00 -->
- <country code="rs">
- <id>Europe/Belgrade</id>
- </country>
-
- <!-- RUSSIAN FEDERATION -->
- <country code="ru">
- <!-- 12:00 -->
- <id>Asia/Kamchatka</id>
- <id>Asia/Anadyr</id>
-
- <!-- 11:00 -->
- <id>Asia/Magadan</id>
- <id>Asia/Sakhalin</id>
- <id>Asia/Srednekolymsk</id>
-
- <!-- 10:00 -->
- <id>Asia/Vladivostok</id>
- <id>Asia/Ust-Nera</id>
-
- <!-- 9:00 -->
- <id>Asia/Yakutsk</id>
- <id>Asia/Chita</id>
- <id>Asia/Khandyga</id>
-
- <!-- 8:00 -->
- <id>Asia/Irkutsk</id>
-
- <!-- 7:00 -->
- <id>Asia/Krasnoyarsk</id>
- <id>Asia/Novosibirsk</id>
- <id>Asia/Barnaul</id>
- <id>Asia/Novokuznetsk</id>
- <id>Asia/Tomsk</id>
-
- <!-- 6:00 -->
- <id>Asia/Omsk</id>
-
- <!-- 5:00 -->
- <id>Asia/Yekaterinburg</id>
-
- <!-- 4:00 -->
- <id>Europe/Samara</id>
- <id>Europe/Astrakhan</id>
- <id>Europe/Ulyanovsk</id>
- <id>Europe/Saratov</id>
-
- <!-- 3:00 -->
- <id>Europe/Moscow</id>
- <id>Europe/Volgograd</id>
- <id>Europe/Kirov</id>
- <id>Europe/Simferopol</id>
-
- <!-- 2:00 -->
- <id>Europe/Kaliningrad</id>
- </country>
-
- <!-- RWANDA, 2:00 -->
- <country code="rw">
- <id>Africa/Kigali</id>
- </country>
-
- <!-- SAUDI ARABIA, 3:00 -->
- <country code="sa">
- <id>Asia/Riyadh</id>
- </country>
-
- <!-- SOLOMON ISLANDS, 11:00 -->
- <country code="sb">
- <id>Pacific/Guadalcanal</id>
- </country>
-
- <!-- SEYCHELLES, 4:00 -->
- <country code="sc">
- <id>Indian/Mahe</id>
- </country>
-
- <!-- SUDAN, 3:00 -->
- <country code="sd">
- <id>Africa/Khartoum</id>
- </country>
-
- <!-- SWEDEN, 1:00 -->
- <country code="se">
- <id>Europe/Stockholm</id>
- </country>
-
- <!-- SINGAPORE, 8:00 -->
- <country code="sg">
- <id>Asia/Singapore</id>
- </country>
-
- <!-- SAINT HELENA, 0:00 -->
- <country code="sh">
- <id>Atlantic/St_Helena</id>
- </country>
-
- <!-- SLOVENIA, 1:00 -->
- <country code="si">
- <id>Europe/Ljubljana</id>
- </country>
-
- <!-- SVALBARD AND JAN MAYEN, 1:00 -->
- <country code="sj">
- <id>Arctic/Longyearbyen</id>
- </country>
-
- <!-- SLOVAKIA, 1:00 -->
- <country code="sk">
- <id>Europe/Bratislava</id>
- </country>
-
- <!-- SIERRA LEONE, 0:00 -->
- <country code="sl">
- <id>Africa/Freetown</id>
- </country>
-
- <!-- SAN MARINO, 1:00 -->
- <country code="sm">
- <id>Europe/San_Marino</id>
- </country>
-
- <!-- SENEGAL, 0:00 -->
- <country code="sn">
- <id>Africa/Dakar</id>
- </country>
-
- <!-- SOMALIA, 3:00 -->
- <country code="so">
- <id>Africa/Mogadishu</id>
- </country>
-
- <!-- SURINAME, -3:00 -->
- <country code="sr">
- <id>America/Paramaribo</id>
- </country>
-
- <!-- South Sudan, 3:00 -->
- <country code="ss">
- <id>Africa/Juba</id>
- </country>
-
- <!-- SAO TOME AND PRINCIPE, 0:00 -->
- <country code="st">
- <id>Africa/Sao_Tome</id>
- </country>
-
- <!-- EL SALVADOR, -6:00 -->
- <country code="sv">
- <id>America/El_Salvador</id>
- </country>
-
- <!-- Sint Maarten, -4:00 -->
- <country code="sx">
- <id>America/Lower_Princes</id>
- </country>
-
- <!-- SYRIAN ARAB REPUBLIC, 2:00 -->
- <country code="sy">
- <id>Asia/Damascus</id>
- </country>
-
- <!-- SWAZILAND, 2:00 -->
- <country code="sz">
- <id>Africa/Mbabane</id>
- </country>
-
- <!-- TURKS AND CAICOS ISLANDS, -4:00 -->
- <country code="tc">
- <id>America/Grand_Turk</id>
- </country>
-
- <!-- CHAD, 1:00 -->
- <country code="td">
- <id>Africa/Ndjamena</id>
- </country>
-
- <!-- FRENCH SOUTHERN TERRITORIES -->
- <country code="tf">
- <!-- 5:00 -->
- <id>Indian/Kerguelen</id>
- </country>
-
- <!-- TOGO, 0:00 -->
- <country code="tg">
- <id>Africa/Lome</id>
- </country>
-
- <!-- THAILAND, 7:00 -->
- <country code="th">
- <id>Asia/Bangkok</id>
- </country>
-
- <!-- TAJIKISTAN, 5:00 -->
- <country code="tj">
- <id>Asia/Dushanbe</id>
- </country>
-
- <!-- TOKELAU, +13:00 -->
- <country code="tk">
- <id>Pacific/Fakaofo</id>
- </country>
-
- <!-- TIMOR-LESTE, 9:00 -->
- <country code="tl">
- <id>Asia/Dili</id>
- </country>
-
- <!-- TURKMENISTAN, 5:00 -->
- <country code="tm">
- <id>Asia/Ashgabat</id>
- </country>
-
- <!-- TUNISIA, 1:00 -->
- <country code="tn">
- <id>Africa/Tunis</id>
- </country>
-
- <!-- TONGA, 13:00 -->
- <country code="to">
- <id>Pacific/Tongatapu</id>
- </country>
-
- <!-- TURKEY, 3:00 -->
- <country code="tr">
- <id>Europe/Istanbul</id>
- </country>
-
- <!-- TRINIDAD AND TOBAGO, -4:00 -->
- <country code="tt">
- <id>America/Port_of_Spain</id>
- </country>
-
- <!-- TUVALU, 12:00 -->
- <country code="tv">
- <id>Pacific/Funafuti</id>
- </country>
-
- <!-- TAIWAN, PROVINCE OF CHINA, 8:00 -->
- <country code="tw">
- <id>Asia/Taipei</id>
- </country>
-
- <!-- TANZANIA, UNITED REPUBLIC OF, 3:00 -->
- <country code="tz">
- <id>Africa/Dar_es_Salaam</id>
- </country>
-
- <!-- UKRAINE, 2:00 -->
- <country code="ua">
- <id>Europe/Kiev</id>
- <id>Europe/Uzhgorod</id>
- <id>Europe/Zaporozhye</id>
- </country>
-
- <!-- UGANDA, 3:00 -->
- <country code="ug">
- <id>Africa/Kampala</id>
- </country>
-
- <!-- UNITED STATES MINOR OUTLYING ISLANDS -->
- <country code="um">
- <!-- 12:00 -->
- <id>Pacific/Wake</id>
-
- <!-- -11:00 -->
- <id>Pacific/Midway</id>
- </country>
-
- <!-- UNITED STATES -->
- <country code="us">
- <!-- -5:00 -->
- <id>America/New_York</id>
- <id>America/Detroit</id>
- <id>America/Kentucky/Louisville</id>
- <id>America/Kentucky/Monticello</id>
- <id>America/Indiana/Indianapolis</id>
- <id>America/Indiana/Vincennes</id>
- <id>America/Indiana/Winamac</id>
- <id>America/Indiana/Marengo</id>
- <id>America/Indiana/Petersburg</id>
- <id>America/Indiana/Vevay</id>
-
- <!-- -6:00 -->
- <id>America/Chicago</id>
- <id>America/Indiana/Knox</id>
- <id>America/Menominee</id>
- <id>America/North_Dakota/Center</id>
- <id>America/North_Dakota/New_Salem</id>
- <id>America/Indiana/Tell_City</id>
- <id>America/North_Dakota/Beulah</id>
-
- <!-- -7:00 -->
- <id>America/Denver</id>
- <id>America/Boise</id>
- <id>America/Phoenix</id>
-
- <!-- -8:00 -->
- <id>America/Los_Angeles</id>
-
- <!-- -9:00 -->
- <id>America/Anchorage</id>
- <id>America/Juneau</id>
- <id>America/Yakutat</id>
- <id>America/Nome</id>
- <id>America/Metlakatla</id>
- <id>America/Sitka</id>
-
- <!-- -10:00 -->
- <id>Pacific/Honolulu</id>
- <id>America/Adak</id>
- </country>
-
- <!-- URUGUAY, -3:00 -->
- <country code="uy">
- <id>America/Montevideo</id>
- </country>
-
- <!-- UZBEKISTAN, 5:00 -->
- <country code="uz">
- <id>Asia/Tashkent</id>
- <id>Asia/Samarkand</id>
- </country>
-
- <!-- HOLY SEE (VATICAN CITY STATE), 1:00 -->
- <country code="va">
- <id>Europe/Vatican</id>
- </country>
-
- <!-- SAINT VINCENT AND THE GRENADINES, -4:00 -->
- <country code="vc">
- <id>America/St_Vincent</id>
- </country>
-
- <!-- VENEZUELA, -4:00 -->
- <country code="ve">
- <id>America/Caracas</id>
- </country>
-
- <!-- VIRGIN ISLANDS, BRITISH, -4:00 -->
- <country code="vg">
- <id>America/Tortola</id>
- </country>
-
- <!-- VIRGIN ISLANDS, U.S., -4:00 -->
- <country code="vi">
- <id>America/St_Thomas</id>
- </country>
-
- <!-- VIET NAM, 7:00 -->
- <country code="vn">
- <id>Asia/Ho_Chi_Minh</id>
- </country>
-
- <!-- VANUATU, 11:00 -->
- <country code="vu">
- <id>Pacific/Efate</id>
- </country>
-
- <!-- WALLIS AND FUTUNA, 12:00 -->
- <country code="wf">
- <id>Pacific/Wallis</id>
- </country>
-
- <!-- SAMOA, 13:00 -->
- <country code="ws">
- <id>Pacific/Apia</id>
- </country>
-
- <!-- YEMEN, 3:00 -->
- <country code="ye">
- <id>Asia/Aden</id>
- </country>
-
- <!-- MAYOTTE, 3:00 -->
- <country code="yt">
- <id>Indian/Mayotte</id>
- </country>
-
- <!-- SOUTH AFRICA, 2:00 -->
- <country code="za">
- <id>Africa/Johannesburg</id>
- </country>
-
- <!-- ZAMBIA, 2:00 -->
- <country code="zm">
- <id>Africa/Lusaka</id>
- </country>
-
- <!-- ZIMBABWE, 2:00 -->
- <country code="zw">
- <id>Africa/Harare</id>
- </country>
- </countryzones>
-</timezones>
diff --git a/tests/Android.bp b/tests/Android.bp
index a03f1a6..2a5b47e 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -61,6 +61,7 @@
"dirent_test.cpp",
"elf_test.cpp",
"endian_test.cpp",
+ "errno_test.cpp",
"error_test.cpp",
"eventfd_test.cpp",
"fcntl_test.cpp",
@@ -88,6 +89,7 @@
"nl_types_test.cpp",
"pthread_test.cpp",
"pty_test.cpp",
+ "qsort_test.cpp",
"regex_test.cpp",
"resolv_test.cpp",
"sched_test.cpp",
diff --git a/tests/errno_test.cpp b/tests/errno_test.cpp
new file mode 100644
index 0000000..ae4ce08
--- /dev/null
+++ b/tests/errno_test.cpp
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ * 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.
+ *
+ * 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.
+ */
+
+#include <gtest/gtest.h>
+
+#include <errno.h>
+
+// Some GNU source likes to declare errno itself for some reason.
+extern "C" int errno;
diff --git a/tests/qsort_test.cpp b/tests/qsort_test.cpp
new file mode 100644
index 0000000..95b4789
--- /dev/null
+++ b/tests/qsort_test.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <gtest/gtest.h>
+
+#include "gtest_globals.h"
+
+#define BUFFER_SIZE 1024
+
+static int cmp_long(const void *l, const void *r)
+{
+
+ return (*(long *)l - *(long *)r);
+}
+
+static int cmp_int(const void *l, const void *r)
+{
+
+ return (*(int *)l - *(int *)r);
+}
+
+#ifndef arc4random_uniform
+static bool seeded;
+
+u_int32_t arc4random_uniform(uint32_t upper_bound)
+{
+ if (!seeded) {
+ srandom((int)time(NULL));
+ seeded = true;
+ }
+
+ return (random() % upper_bound);
+}
+#endif
+
+TEST(qsort_test, long_test) {
+ long buf[BUFFER_SIZE];
+ long i;
+
+ /* Initialize buffer with known numbers */
+ for (i=0; i<BUFFER_SIZE; i++)
+ buf[i] = i;
+
+ /* Stir 1/4 pairs in the buffer */
+ for (i=0; i<BUFFER_SIZE/4; i++) {
+ u_int32_t pos1, pos2;
+ long t;
+
+ pos1 = arc4random_uniform(BUFFER_SIZE);
+ pos2 = arc4random_uniform(BUFFER_SIZE);
+
+ t = buf[pos1];
+ buf[pos1] = buf[pos2];
+ buf[pos2] = t;
+ }
+
+ /* Sort */
+ qsort(buf, BUFFER_SIZE, sizeof(buf[0]), &cmp_long);
+
+ for (i=0; i<BUFFER_SIZE; i++)
+ EXPECT_EQ(i, buf[i]);
+}
+
+TEST(qsort_test, int_test) {
+ int buf[BUFFER_SIZE];
+ int i;
+
+ /* Initialize buffer with known numbers */
+ for (i=0; i<BUFFER_SIZE; i++)
+ buf[i] = i;
+
+ /* Stir 1/4 pairs in the buffer */
+ for (i=0; i<BUFFER_SIZE/4; i++) {
+ u_int32_t pos1, pos2;
+ int t;
+
+ pos1 = arc4random_uniform(BUFFER_SIZE);
+ pos2 = arc4random_uniform(BUFFER_SIZE);
+
+ t = buf[pos1];
+ buf[pos1] = buf[pos2];
+ buf[pos2] = t;
+ }
+
+ /* Sort */
+ qsort(buf, BUFFER_SIZE, sizeof(buf[0]), &cmp_int);
+
+ for (i=0; i<BUFFER_SIZE; i++)
+ EXPECT_EQ(i, buf[i]);
+}