1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
4103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius*   Copyright (C) 1997-2012, International Business Machines
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  FILE NAME : putilimp.h
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   10/17/04    grhoten     Move internal functions from putil.h to this file.
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef PUTILIMP_H
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define PUTILIMP_H
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
23103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC
24103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Nearly all CPUs and compilers implement a right-shift of a signed integer
25103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * as an Arithmetic Shift Right which copies the sign bit (the Most Significant Bit (MSB))
26103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * into the vacated bits (sign extension).
27103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * For example, (int32_t)0xfff5fff3>>4 becomes 0xffff5fff and -1>>1=-1.
28103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *
29103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This can be useful for storing a signed value in the upper bits
30103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * and another bit field in the lower bits.
31103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * The signed value can be retrieved by simple right-shifting.
32103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *
33103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This is consistent with the Java language.
34103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *
35103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * However, the C standard allows compilers to implement a right-shift of a signed integer
36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * as a Logical Shift Right which copies a 0 into the vacated bits.
37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * For example, (int32_t)0xfff5fff3>>4 becomes 0x0fff5fff and -1>>1=0x7fffffff.
38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *
39103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Code that depends on the natural behavior should be guarded with this macro,
40103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * with an alternate path for unusual platforms.
41103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
43103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC
44103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
45103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
46103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /*
47103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * Nearly all CPUs & compilers implement a right-shift of a signed integer
48103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * as an Arithmetic Shift Right (with sign extension).
49103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     */
50103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_SIGNED_RIGHT_SHIFT_IS_ARITHMETIC 1
51103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
52103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
53103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** Define this to 1 if your platform supports IEEE 754 floating point,
54103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius   to 0 if it does not. */
55103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifndef IEEE_754
56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define IEEE_754 1
57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
58103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
59103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
60103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * uintptr_t is an optional part of the standard definitions in stdint.h.
61103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * The opengroup.org documentation for stdint.h says
62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * "On XSI-conformant systems, the intptr_t and uintptr_t types are required;
63103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * otherwise, they are optional."
64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * We assume that when uintptr_t is defined, UINTPTR_MAX is defined as well.
65103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *
66103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Do not use ptrdiff_t since it is signed. size_t is unsigned.
67103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
68103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* TODO: This check fails on some z environments. Filed a ticket #9357 for this. */
69103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !defined(__intptr_t_defined) && !defined(UINTPTR_MAX) && (U_PLATFORM != U_PF_OS390)
70103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliustypedef size_t uintptr_t;
71103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
74103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_HAVE_MSVC_2003_OR_EARLIER
75103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Flag for workaround of MSVC 2003 optimization bugs
76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
77103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
78103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !defined(U_HAVE_MSVC_2003_OR_EARLIER) && defined(_MSC_VER) && (_MSC_VER < 1400)
79103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define U_HAVE_MSVC_2003_OR_EARLIER
80103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
81103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
82103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
83103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @{ Information about POSIX support                                       */
84103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
85103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
86103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_HAVE_NL_LANGINFO_CODESET
87103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
88103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_HAS_WIN32_API
89103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_NL_LANGINFO_CODESET 0
90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
91103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_NL_LANGINFO_CODESET 1
92103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
93103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
94103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_NL_LANGINFO_CODESET
95103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
96103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif !U_HAVE_NL_LANGINFO_CODESET
97103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_NL_LANGINFO_CODESET -1
98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400
99103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius   /* not defined */
100103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_NL_LANGINFO_CODESET CODESET
102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
103103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_TZSET
105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API
107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TZSET _tzset
108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400
109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius   /* not defined */
110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TZSET tzset
112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_TIMEZONE
115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
11654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#elif U_PLATFORM == U_PF_ANDROID
11754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#   define U_TIMEZONE timezone
118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_IS_LINUX_BASED
119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TIMEZONE __timezone
120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API
121103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TIMEZONE _timezone
12254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#elif U_PLATFORM == U_PF_BSD && !defined(__NetBSD__)
12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius   /* not defined */
124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400
125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius   /* not defined */
126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
127103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TIMEZONE timezone
128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_TZNAME
131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API
133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TZNAME _tzname
134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400
135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius   /* not defined */
136103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_TZNAME tzname
138103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
140103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_HAVE_MMAP
141103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
142103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_HAS_WIN32_API
143103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_MMAP 0
144103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_MMAP 1
146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_HAVE_POPEN
149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_USES_ONLY_WIN32_API
151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_POPEN 0
152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_OS400
153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_POPEN 0
154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_POPEN 1
156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
159103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_HAVE_DIRENT_H
160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Defines whether dirent.h is available.
161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_HAVE_DIRENT_H
164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM_HAS_WIN32_API
166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_DIRENT_H 0
167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_DIRENT_H 1
169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
170103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
171103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @} */
172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
174103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @{ GCC built in functions for atomic memory operations                   */
175103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
176103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
177103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_HAVE_GCC_ATOMICS
179103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
180103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
181103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_HAVE_GCC_ATOMICS
182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
18354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#elif U_GCC_MAJOR_MINOR >= 404
184103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_GCC_ATOMICS 1
185103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
186103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_HAVE_GCC_ATOMICS 0
187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @} */
190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
191103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @{ Code alignment                                                        */
193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_ALIGN_CODE
197103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This is used to align code fragments to a specific byte boundary.
198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This is useful for getting consistent performance test results.
199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
201103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_ALIGN_CODE
202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
203103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif defined(_MSC_VER) && defined(_M_IX86) && !defined(_MANAGED)
204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_ALIGN_CODE(boundarySize) __asm  align boundarySize
205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_ALIGN_CODE(boundarySize)
207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
208103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
209103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @} */
210103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
212103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @{ Programs used by ICU code                                             */
213103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*===========================================================================*/
214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
216103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * \def U_MAKE_IS_NMAKE
217103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Defines whether the "make" program is Windows nmake.
218103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
219103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef U_MAKE_IS_NMAKE
220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* Use the predefined value. */
221103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#elif U_PLATFORM == U_PF_WINDOWS
222103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_MAKE_IS_NMAKE 1
223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else
224103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#   define U_MAKE_IS_NMAKE 0
225103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/** @} */
228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*==========================================================================*/
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Platform utilities                                                       */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*==========================================================================*/
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Platform utilities isolates the platform dependencies of the
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * libarary.  For each platform which this code is ported to, these
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * functions may have to be re-implemented.
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to determine if a double is Not a Number (NaN).
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UBool   U_EXPORT2 uprv_isNaN(double d);
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to determine if a double has an infinite value.
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UBool   U_EXPORT2 uprv_isInfinite(double d);
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to determine if a double has a positive infinite value.
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UBool   U_EXPORT2 uprv_isPositiveInfinity(double d);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to determine if a double has a negative infinite value.
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UBool   U_EXPORT2 uprv_isNegativeInfinity(double d);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility that returns a Not a Number (NaN) value.
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_getNaN(void);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility that returns an infinite value.
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_getInfinity(void);
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to truncate a double.
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_trunc(double d);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the floor of a double.
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_floor(double d);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the ceiling of a double.
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_ceil(double d);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the absolute value of a double.
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_fabs(double d);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the fractional and integer parts of a double.
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_modf(double d, double* pinteger);
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the remainder of a double divided by another double.
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_fmod(double d, double y);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate d to the power of exponent (d^exponent).
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_pow(double d, double exponent);
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate 10 to the power of exponent (10^exponent).
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_pow10(int32_t exponent);
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the maximum value of two doubles.
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_fmax(double d, double y);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the minimum value of two doubles.
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_fmin(double d, double y);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Private utility to calculate the maximum value of two integers.
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL int32_t U_EXPORT2 uprv_max(int32_t d, int32_t y);
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Private utility to calculate the minimum value of two integers.
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y);
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IS_BIG_ENDIAN
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define uprv_isNegative(number) (*((signed char *)&(number))<0)
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define uprv_isNegative(number) (*((signed char *)&(number)+sizeof(number)-1)<0)
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the largest positive number that can be represented by an integer
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * type of arbitrary bit length.
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_maxMantissa(void);
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Floating point utility to calculate the logarithm of a double.
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_log(double d);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Does common notion of rounding e.g. uprv_floor(x + 0.5);
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param x the double number
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the rounded double
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL double  U_EXPORT2 uprv_round(double x);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns the number of digits after the decimal point in a double number x.
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param x the double number
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the number of digits after the decimal point in a double number x.
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*U_INTERNAL int32_t  U_EXPORT2 uprv_digitsAfterDecimal(double x);*/
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
369103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_CHARSET_IS_UTF8
370103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
371103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Please use ucnv_getDefaultName() instead.
372103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Return the default codepage for this platform and locale.
373103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This function can call setlocale() on Unix platforms. Please read the
374103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * platform documentation on setlocale() before calling this function.
375103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @return the default codepage for this platform
376103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
378103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_INTERNAL const char*  U_EXPORT2 uprv_getDefaultCodepage(void);
379103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
380103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
381103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/**
382103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Please use uloc_getDefault() instead.
383103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Return the default locale ID string by querying ths system, or
384103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius *     zero if one cannot be found.
385103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This function can call setlocale() on Unix platforms. Please read the
386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * platform documentation on setlocale() before calling this function.
387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @return the default locale ID string
388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @internal
389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */
390103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusU_INTERNAL const char*  U_EXPORT2 uprv_getDefaultLocaleID(void);
391103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Time zone utilities
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Wrappers for C runtime library functions relating to timezones.
396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * The t_tzset() function (similar to tzset) uses the current setting
397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * of the environment variable TZ to assign values to three global
398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * variables: daylight, timezone, and tzname. These variables have the
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * following meanings, and are declared in &lt;time.h&gt;.
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   daylight   Nonzero if daylight-saving-time zone (DST) is specified
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              in TZ; otherwise, 0. Default value is 1.
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   timezone   Difference in seconds between coordinated universal
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              time and local time. E.g., -28,800 for PST (GMT-8hrs)
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   tzname(0)  Three-letter time-zone name derived from TZ environment
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              variable. E.g., "PST".
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   tzname(1)  Three-letter DST zone name derived from TZ environment
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              variable.  E.g., "PDT". If DST zone is omitted from TZ,
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              tzname(1) is an empty string.
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Notes: For example, to set the TZ environment variable to correspond
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to the current time zone in Germany, you can use one of the
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * following statements:
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   set TZ=GST1GDT
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   set TZ=GST+1GDT
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If the TZ value is not set, t_tzset() attempts to use the time zone
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * information specified by the operating system. Under Windows NT
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and Windows 95, this information is specified in the Control Panel's
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Date/Time application.
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL void     U_EXPORT2 uprv_tzset(void);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Difference in seconds between coordinated universal
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * time and local time. E.g., -28,800 for PST (GMT-8hrs)
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the difference in seconds between coordinated universal time and local time.
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL int32_t  U_EXPORT2 uprv_timezone(void);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   tzname(0)  Three-letter time-zone name derived from TZ environment
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              variable. E.g., "PST".
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   tzname(1)  Three-letter DST zone name derived from TZ environment
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              variable.  E.g., "PDT". If DST zone is omitted from TZ,
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *              tzname(1) is an empty string.
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL const char* U_EXPORT2 uprv_tzname(int n);
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970.
44627f654740f2a26ad62a5c155af9199af9e69b889claireho * This function is affected by 'faketime' and should be the bottleneck for all user-visible ICU time functions.
447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @return the UTC time measured in milliseconds
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UDate U_EXPORT2 uprv_getUTCtime(void);
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
45327f654740f2a26ad62a5c155af9199af9e69b889claireho * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970.
45427f654740f2a26ad62a5c155af9199af9e69b889claireho * This function is not affected by 'faketime', so it should only be used by low level test functions- not by anything that
45527f654740f2a26ad62a5c155af9199af9e69b889claireho * exposes time to the end user.
45627f654740f2a26ad62a5c155af9199af9e69b889claireho * @return the UTC time measured in milliseconds
45727f654740f2a26ad62a5c155af9199af9e69b889claireho * @internal
45827f654740f2a26ad62a5c155af9199af9e69b889claireho */
45927f654740f2a26ad62a5c155af9199af9e69b889clairehoU_INTERNAL UDate U_EXPORT2 uprv_getRawUTCtime(void);
46027f654740f2a26ad62a5c155af9199af9e69b889claireho
46127f654740f2a26ad62a5c155af9199af9e69b889claireho/**
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Determine whether a pathname is absolute or not, as defined by the platform.
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param path Pathname to test
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if the path is absolute
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal (ICU 3.0)
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL UBool U_EXPORT2 uprv_pathIsAbsolute(const char *path);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Use U_MAX_PTR instead of this function.
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param void pointer to test
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the largest possible pointer greater than the base
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal (ICU 3.8)
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_INTERNAL void * U_EXPORT2 uprv_maximumPtr(void *base);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Maximum value of a (void*) - use to indicate the limit of an 'infinite' buffer.
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * In fact, buffer sizes must not exceed 2GB so that the difference between
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the buffer limit and the buffer start can be expressed in an int32_t.
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The definition of U_MAX_PTR must fulfill the following conditions:
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - return the largest possible pointer greater than base
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - return a valid pointer according to the machine architecture (AS/400, 64-bit, etc.)
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - avoid wrapping around at high addresses
486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * - make sure that the returned pointer is not farther from base than 0x7fffffff bytes
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param base The beginning of a buffer to find the maximum offset from
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef U_MAX_PTR
492103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#  if U_PLATFORM == U_PF_OS390 && !defined(_LP64)
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* We have 31-bit pointers. */
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#    define U_MAX_PTR(base) ((void *)0x7fffffff)
495103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#  elif U_PLATFORM == U_PF_OS400
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#    define U_MAX_PTR(base) uprv_maximumPtr((void *)base)
497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#  elif 0
498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*
499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * For platforms where pointers are scalar values (which is normal, but unlike i5/OS)
500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * but that do not define uintptr_t.
501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *
502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * However, this does not work on modern compilers:
503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The C++ standard does not define pointer overflow, and allows compilers to
504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * assume that p+u>p for any pointer p and any integer u>0.
505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Thus, modern compilers optimize away the ">" comparison.
506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * (See ICU tickets #7187 and #8096.)
507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#    define U_MAX_PTR(base) \
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ((void *)(((char *)(base)+0x7fffffffu) > (char *)(base) \
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ? ((char *)(base)+0x7fffffffu) \
511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        : (char *)-1))
512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#  else
513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Default version. C++ standard compliant for scalar pointers. */
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#    define U_MAX_PTR(base) \
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((void *)(((uintptr_t)(base)+0x7fffffffu) > (uintptr_t)(base) \
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ? ((uintptr_t)(base)+0x7fffffffu) \
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        : (uintptr_t)-1))
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#  endif
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*  Dynamic Library Functions */
52250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef void (UVoidFunction)(void);
524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_ENABLE_DYLOAD
52650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
52750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Load a library
52850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * @internal (ICU 4.4)
52950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
53050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status);
53150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
53250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
53350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Close a library
53450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * @internal (ICU 4.4)
53550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
53650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_INTERNAL void U_EXPORT2 uprv_dl_close( void *lib, UErrorCode *status);
53750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
53850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Extract a symbol from a library (function)
540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @internal (ICU 4.8)
54150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func( void *lib, const char *symbolName, UErrorCode *status);
543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Extract a symbol from a library (function)
546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Not implemented, no clients.
547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @internal
548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* U_INTERNAL void * U_EXPORT2 uprv_dlsym_data( void *lib, const char *symbolName, UErrorCode *status); */
550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Define malloc and related functions
555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @internal
556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS400
558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_malloc(x) _C_TS_malloc(x)
559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_realloc(x,y) _C_TS_realloc(x,y)
560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_free(x) _C_TS_free(x)
561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* also _C_TS_calloc(x) */
562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else
563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* C defaults */
564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_malloc(x) malloc(x)
565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_realloc(x,y) realloc(x,y)
566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define uprv_default_free(x) free(x)
567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif
568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
56950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
571