Home | History | Annotate | Download | only in common
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1997-2011, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************
      8 *
      9 *  FILE NAME : putilimp.h
     10 *
     11 *   Date        Name        Description
     12 *   10/17/04    grhoten     Move internal functions from putil.h to this file.
     13 ******************************************************************************
     14 */
     15 
     16 #ifndef PUTILIMP_H
     17 #define PUTILIMP_H
     18 
     19 #include "unicode/utypes.h"
     20 #include "unicode/putil.h"
     21 
     22 /*==========================================================================*/
     23 /* Platform utilities                                                       */
     24 /*==========================================================================*/
     25 
     26 /**
     27  * Platform utilities isolates the platform dependencies of the
     28  * libarary.  For each platform which this code is ported to, these
     29  * functions may have to be re-implemented.
     30  */
     31 
     32 /**
     33  * Floating point utility to determine if a double is Not a Number (NaN).
     34  * @internal
     35  */
     36 U_INTERNAL UBool   U_EXPORT2 uprv_isNaN(double d);
     37 /**
     38  * Floating point utility to determine if a double has an infinite value.
     39  * @internal
     40  */
     41 U_INTERNAL UBool   U_EXPORT2 uprv_isInfinite(double d);
     42 /**
     43  * Floating point utility to determine if a double has a positive infinite value.
     44  * @internal
     45  */
     46 U_INTERNAL UBool   U_EXPORT2 uprv_isPositiveInfinity(double d);
     47 /**
     48  * Floating point utility to determine if a double has a negative infinite value.
     49  * @internal
     50  */
     51 U_INTERNAL UBool   U_EXPORT2 uprv_isNegativeInfinity(double d);
     52 /**
     53  * Floating point utility that returns a Not a Number (NaN) value.
     54  * @internal
     55  */
     56 U_INTERNAL double  U_EXPORT2 uprv_getNaN(void);
     57 /**
     58  * Floating point utility that returns an infinite value.
     59  * @internal
     60  */
     61 U_INTERNAL double  U_EXPORT2 uprv_getInfinity(void);
     62 
     63 /**
     64  * Floating point utility to truncate a double.
     65  * @internal
     66  */
     67 U_INTERNAL double  U_EXPORT2 uprv_trunc(double d);
     68 /**
     69  * Floating point utility to calculate the floor of a double.
     70  * @internal
     71  */
     72 U_INTERNAL double  U_EXPORT2 uprv_floor(double d);
     73 /**
     74  * Floating point utility to calculate the ceiling of a double.
     75  * @internal
     76  */
     77 U_INTERNAL double  U_EXPORT2 uprv_ceil(double d);
     78 /**
     79  * Floating point utility to calculate the absolute value of a double.
     80  * @internal
     81  */
     82 U_INTERNAL double  U_EXPORT2 uprv_fabs(double d);
     83 /**
     84  * Floating point utility to calculate the fractional and integer parts of a double.
     85  * @internal
     86  */
     87 U_INTERNAL double  U_EXPORT2 uprv_modf(double d, double* pinteger);
     88 /**
     89  * Floating point utility to calculate the remainder of a double divided by another double.
     90  * @internal
     91  */
     92 U_INTERNAL double  U_EXPORT2 uprv_fmod(double d, double y);
     93 /**
     94  * Floating point utility to calculate d to the power of exponent (d^exponent).
     95  * @internal
     96  */
     97 U_INTERNAL double  U_EXPORT2 uprv_pow(double d, double exponent);
     98 /**
     99  * Floating point utility to calculate 10 to the power of exponent (10^exponent).
    100  * @internal
    101  */
    102 U_INTERNAL double  U_EXPORT2 uprv_pow10(int32_t exponent);
    103 /**
    104  * Floating point utility to calculate the maximum value of two doubles.
    105  * @internal
    106  */
    107 U_INTERNAL double  U_EXPORT2 uprv_fmax(double d, double y);
    108 /**
    109  * Floating point utility to calculate the minimum value of two doubles.
    110  * @internal
    111  */
    112 U_INTERNAL double  U_EXPORT2 uprv_fmin(double d, double y);
    113 /**
    114  * Private utility to calculate the maximum value of two integers.
    115  * @internal
    116  */
    117 U_INTERNAL int32_t U_EXPORT2 uprv_max(int32_t d, int32_t y);
    118 /**
    119  * Private utility to calculate the minimum value of two integers.
    120  * @internal
    121  */
    122 U_INTERNAL int32_t U_EXPORT2 uprv_min(int32_t d, int32_t y);
    123 
    124 #if U_IS_BIG_ENDIAN
    125 #   define uprv_isNegative(number) (*((signed char *)&(number))<0)
    126 #else
    127 #   define uprv_isNegative(number) (*((signed char *)&(number)+sizeof(number)-1)<0)
    128 #endif
    129 
    130 /**
    131  * Return the largest positive number that can be represented by an integer
    132  * type of arbitrary bit length.
    133  * @internal
    134  */
    135 U_INTERNAL double  U_EXPORT2 uprv_maxMantissa(void);
    136 
    137 /**
    138  * Floating point utility to calculate the logarithm of a double.
    139  * @internal
    140  */
    141 U_INTERNAL double  U_EXPORT2 uprv_log(double d);
    142 
    143 /**
    144  * Does common notion of rounding e.g. uprv_floor(x + 0.5);
    145  * @param x the double number
    146  * @return the rounded double
    147  * @internal
    148  */
    149 U_INTERNAL double  U_EXPORT2 uprv_round(double x);
    150 
    151 #if 0
    152 /**
    153  * Returns the number of digits after the decimal point in a double number x.
    154  *
    155  * @param x the double number
    156  * @return the number of digits after the decimal point in a double number x.
    157  * @internal
    158  */
    159 /*U_INTERNAL int32_t  U_EXPORT2 uprv_digitsAfterDecimal(double x);*/
    160 #endif
    161 
    162 /**
    163  * Time zone utilities
    164  *
    165  * Wrappers for C runtime library functions relating to timezones.
    166  * The t_tzset() function (similar to tzset) uses the current setting
    167  * of the environment variable TZ to assign values to three global
    168  * variables: daylight, timezone, and tzname. These variables have the
    169  * following meanings, and are declared in &lt;time.h&gt;.
    170  *
    171  *   daylight   Nonzero if daylight-saving-time zone (DST) is specified
    172  *              in TZ; otherwise, 0. Default value is 1.
    173  *   timezone   Difference in seconds between coordinated universal
    174  *              time and local time. E.g., -28,800 for PST (GMT-8hrs)
    175  *   tzname(0)  Three-letter time-zone name derived from TZ environment
    176  *              variable. E.g., "PST".
    177  *   tzname(1)  Three-letter DST zone name derived from TZ environment
    178  *              variable.  E.g., "PDT". If DST zone is omitted from TZ,
    179  *              tzname(1) is an empty string.
    180  *
    181  * Notes: For example, to set the TZ environment variable to correspond
    182  * to the current time zone in Germany, you can use one of the
    183  * following statements:
    184  *
    185  *   set TZ=GST1GDT
    186  *   set TZ=GST+1GDT
    187  *
    188  * If the TZ value is not set, t_tzset() attempts to use the time zone
    189  * information specified by the operating system. Under Windows NT
    190  * and Windows 95, this information is specified in the Control Panel's
    191  * Date/Time application.
    192  * @internal
    193  */
    194 U_INTERNAL void     U_EXPORT2 uprv_tzset(void);
    195 
    196 /**
    197  * Difference in seconds between coordinated universal
    198  * time and local time. E.g., -28,800 for PST (GMT-8hrs)
    199  * @return the difference in seconds between coordinated universal time and local time.
    200  * @internal
    201  */
    202 U_INTERNAL int32_t  U_EXPORT2 uprv_timezone(void);
    203 
    204 /**
    205  *   tzname(0)  Three-letter time-zone name derived from TZ environment
    206  *              variable. E.g., "PST".
    207  *   tzname(1)  Three-letter DST zone name derived from TZ environment
    208  *              variable.  E.g., "PDT". If DST zone is omitted from TZ,
    209  *              tzname(1) is an empty string.
    210  * @internal
    211  */
    212 U_INTERNAL const char* U_EXPORT2 uprv_tzname(int n);
    213 
    214 /**
    215  * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970.
    216  * This function is affected by 'faketime' and should be the bottleneck for all user-visible ICU time functions.
    217  * @return the UTC time measured in milliseconds
    218  * @internal
    219  */
    220 U_INTERNAL UDate U_EXPORT2 uprv_getUTCtime(void);
    221 
    222 /**
    223  * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970.
    224  * This function is not affected by 'faketime', so it should only be used by low level test functions- not by anything that
    225  * exposes time to the end user.
    226  * @return the UTC time measured in milliseconds
    227  * @internal
    228  */
    229 U_INTERNAL UDate U_EXPORT2 uprv_getRawUTCtime(void);
    230 
    231 /**
    232  * Determine whether a pathname is absolute or not, as defined by the platform.
    233  * @param path Pathname to test
    234  * @return TRUE if the path is absolute
    235  * @internal (ICU 3.0)
    236  */
    237 U_INTERNAL UBool U_EXPORT2 uprv_pathIsAbsolute(const char *path);
    238 
    239 /**
    240  * Use U_MAX_PTR instead of this function.
    241  * @param void pointer to test
    242  * @return the largest possible pointer greater than the base
    243  * @internal (ICU 3.8)
    244  */
    245 U_INTERNAL void * U_EXPORT2 uprv_maximumPtr(void *base);
    246 
    247 /**
    248  * Maximum value of a (void*) - use to indicate the limit of an 'infinite' buffer.
    249  * In fact, buffer sizes must not exceed 2GB so that the difference between
    250  * the buffer limit and the buffer start can be expressed in an int32_t.
    251  *
    252  * The definition of U_MAX_PTR must fulfill the following conditions:
    253  * - return the largest possible pointer greater than base
    254  * - return a valid pointer according to the machine architecture (AS/400, 64-bit, etc.)
    255  * - avoid wrapping around at high addresses
    256  * - make sure that the returned pointer is not farther from base than 0x7fffffff bytes
    257  *
    258  * @param base The beginning of a buffer to find the maximum offset from
    259  * @internal
    260  */
    261 #ifndef U_MAX_PTR
    262 #  if defined(OS390) && !defined(_LP64)
    263     /* We have 31-bit pointers. */
    264 #    define U_MAX_PTR(base) ((void *)0x7fffffff)
    265 #  elif defined(OS400)
    266 #    define U_MAX_PTR(base) uprv_maximumPtr((void *)base)
    267 #  elif 0
    268     /*
    269      * For platforms where pointers are scalar values (which is normal, but unlike i5/OS)
    270      * but that do not define uintptr_t.
    271      *
    272      * However, this does not work on modern compilers:
    273      * The C++ standard does not define pointer overflow, and allows compilers to
    274      * assume that p+u>p for any pointer p and any integer u>0.
    275      * Thus, modern compilers optimize away the ">" comparison.
    276      * (See ICU tickets #7187 and #8096.)
    277      */
    278 #    define U_MAX_PTR(base) \
    279     ((void *)(((char *)(base)+0x7fffffffu) > (char *)(base) \
    280         ? ((char *)(base)+0x7fffffffu) \
    281         : (char *)-1))
    282 #  else
    283     /* Default version. C++ standard compliant for scalar pointers. */
    284 #    define U_MAX_PTR(base) \
    285     ((void *)(((uintptr_t)(base)+0x7fffffffu) > (uintptr_t)(base) \
    286         ? ((uintptr_t)(base)+0x7fffffffu) \
    287         : (uintptr_t)-1))
    288 #  endif
    289 #endif
    290 
    291 #if U_ENABLE_DYLOAD
    292 /*  Dynamic Library Functions */
    293 
    294 typedef void (UVoidFunction)(void);
    295 
    296 /**
    297  * Load a library
    298  * @internal (ICU 4.4)
    299  */
    300 U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status);
    301 
    302 /**
    303  * Close a library
    304  * @internal (ICU 4.4)
    305  */
    306 U_INTERNAL void U_EXPORT2 uprv_dl_close( void *lib, UErrorCode *status);
    307 
    308 /**
    309  * Extract a symbol from a library (function)
    310  * @internal (ICU 4.8)
    311  */
    312 U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func( void *lib, const char *symbolName, UErrorCode *status);
    313 
    314 /**
    315  * Extract a symbol from a library (function)
    316  * Not implemented, no clients.
    317  * @internal
    318  */
    319 /* U_INTERNAL void * U_EXPORT2 uprv_dlsym_data( void *lib, const char *symbolName, UErrorCode *status); */
    320 
    321 
    322 /**
    323  * Define malloc and related functions
    324  * @internal
    325  */
    326 #if defined(OS400)
    327 # define uprv_default_malloc(x) _C_TS_malloc(x)
    328 # define uprv_default_realloc(x,y) _C_TS_realloc(x,y)
    329 # define uprv_default_free(x) _C_TS_free(x)
    330 /* also _C_TS_calloc(x) */
    331 #else
    332 /* C defaults */
    333 # define uprv_default_malloc(x) malloc(x)
    334 # define uprv_default_realloc(x,y) realloc(x,y)
    335 # define uprv_default_free(x) free(x)
    336 #endif
    337 
    338 
    339 #endif
    340 
    341 #endif
    342