Home | History | Annotate | Download | only in sys
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 #ifndef _SYS__WCHAR_LIMITS_H
     29 #define _SYS__WCHAR_LIMITS_H
     30 
     31 #include <android/api-level.h>
     32 
     33 /* WCHAR_MIN / WCHAR_MAX can be defined by <stdint.h> or <wchar.h>.
     34  * Due to historical reasons, their definition is a bit complex.
     35  *
     36  * - In NDK r8e and older, all definitions of WCHAR_MIN and WCHAR_MAX
     37  *   where 32-bit signed values (with one exception described below),
     38  *   despite the fact that wchar_t is 'unsigned' on ARM.
     39  *   See http://b.android.com/57749
     40  *
     41  *   This is no longer the case, unless you define _WCHAR_IS_ALWAYS_SIGNED
     42  *   at compile time to restore the old (broken) behaviour. This doesn't
     43  *   affect other CPU ABIs.
     44  *
     45  * - Before API level 9, on ARM, wchar_t was typedef to 'char' when
     46  *   compiling C (not C++). Also, the definitions of WCHAR_MIN and
     47  *   WCHAR_MAX differed between <stdint.h> and <wchar.h>:
     48  *
     49  *     <stdint.h> conditionally defined them to INT32_MIN / INT32_MAX.
     50  *     <wchar.h> conditionally defined them to 0 and 255 instead.
     51  *
     52  *   <stdint.h> would only define WCHAR_MIN and WCHAR_MAX when:
     53  *    - Compiling C sources.
     54  *    - Compiling C++ sources with __STDC_LIMIT_MACROS being defined.
     55  *
     56  *   <wchar.h> always ends up including <stdint.h> indirectly. This
     57  *   means that:
     58  *
     59  *     - When compiling C sources, WCHAR_MIN / WCHAR_MAX were always
     60  *       defined as INT32_MIN / INT32_MAX.
     61  *
     62  *     - When compiling C++ sources with __STDC_LIMIT_MACROS defined,
     63  *       they were always defined to INT32_MIN / INT32_MAX
     64  *
     65  *     - When compiling C++ sources without __STDC_LIMIT_MACROS defined,
     66  *       they were defined by <wchar.h> as 0 and 255, respectively.
     67  *
     68  *    Keep in mind that this was ARM-specific, only for API level < 9.
     69  *
     70  *    If _WCHAR_IS_8BIT is defined, the same broken behaviour will
     71  *    be restored. See http://b.android.com/57267
     72  */
     73 #if !defined(WCHAR_MIN)
     74 
     75 #  if defined(_WCHAR_IS_8BIT) && defined(__arm__) && __ANDROID_API__ < 9
     76 #    if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
     77 #      define WCHAR_MIN  0
     78 #      define WCHAR_MAX  255
     79 #    else
     80 #      define WCHAR_MIN   (-2147483647 - 1)
     81 #      define WCHAR_MAX   (2147483647)
     82 #    endif
     83 #  elif defined(_WCHAR_IS_ALWAYS_SIGNED)
     84 #    define WCHAR_MIN   (-2147483647 - 1)
     85 #    define WCHAR_MAX   (2147483647)
     86 #  else
     87   /* Otherwise, the value is derived from the toolchain configuration.
     88    * to avoid putting explicit CPU checks in this header. */
     89 #    define WCHAR_MAX __WCHAR_MAX__
     90 
     91   /* Clang does not define __WCHAR_MIN__ */
     92 #    if defined(__WCHAR_UNSIGNED__)
     93 #      define WCHAR_MIN L'\0'
     94 #    else
     95 #      define WCHAR_MIN (-(WCHAR_MAX) - 1)
     96 #    endif
     97 #  endif /* !_WCHAR_IS_ALWAYS_SIGNED */
     98 
     99 #endif /* !WCHAR_MIN */
    100 
    101 #endif  /* _SYS__WCHAR_LIMITS_H */
    102