123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- +----------------------------------------------------------------------+
- | Zend Engine |
- +----------------------------------------------------------------------+
- | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.00 of the Zend license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.zend.com/license/2_00.txt. |
- | If you did not receive a copy of the Zend license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@zend.com so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Anatol Belski <ab@php.net> |
- +----------------------------------------------------------------------+
- */
- #ifndef ZEND_LONG_H
- #define ZEND_LONG_H
- #include "main/php_stdint.h"
- /* This is the heart of the whole int64 enablement in zval. */
- #if defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64)
- # define ZEND_ENABLE_ZVAL_LONG64 1
- #endif
- /* Integer types. */
- #ifdef ZEND_ENABLE_ZVAL_LONG64
- typedef int64_t zend_long;
- typedef uint64_t zend_ulong;
- typedef int64_t zend_off_t;
- # define ZEND_LONG_MAX INT64_MAX
- # define ZEND_LONG_MIN INT64_MIN
- # define ZEND_ULONG_MAX UINT64_MAX
- # define Z_L(i) INT64_C(i)
- # define Z_UL(i) UINT64_C(i)
- # define SIZEOF_ZEND_LONG 8
- #else
- typedef int32_t zend_long;
- typedef uint32_t zend_ulong;
- typedef int32_t zend_off_t;
- # define ZEND_LONG_MAX INT32_MAX
- # define ZEND_LONG_MIN INT32_MIN
- # define ZEND_ULONG_MAX UINT32_MAX
- # define Z_L(i) INT32_C(i)
- # define Z_UL(i) UINT32_C(i)
- # define SIZEOF_ZEND_LONG 4
- #endif
- /* Conversion macros. */
- #define ZEND_LTOA_BUF_LEN 65
- #ifdef ZEND_ENABLE_ZVAL_LONG64
- # define ZEND_LONG_FMT "%" PRId64
- # define ZEND_ULONG_FMT "%" PRIu64
- # define ZEND_XLONG_FMT "%" PRIx64
- # define ZEND_LONG_FMT_SPEC PRId64
- # define ZEND_ULONG_FMT_SPEC PRIu64
- # ifdef ZEND_WIN32
- # define ZEND_LTOA(i, s, len) _i64toa_s((i), (s), (len), 10)
- # define ZEND_ATOL(s) _atoi64((s))
- # define ZEND_STRTOL(s0, s1, base) _strtoi64((s0), (s1), (base))
- # define ZEND_STRTOUL(s0, s1, base) _strtoui64((s0), (s1), (base))
- # define ZEND_STRTOL_PTR _strtoi64
- # define ZEND_STRTOUL_PTR _strtoui64
- # define ZEND_ABS _abs64
- # else
- # define ZEND_LTOA(i, s, len) \
- do { \
- int st = snprintf((s), (len), ZEND_LONG_FMT, (i)); \
- (s)[st] = '\0'; \
- } while (0)
- # define ZEND_ATOL(s) atoll((s))
- # define ZEND_STRTOL(s0, s1, base) strtoll((s0), (s1), (base))
- # define ZEND_STRTOUL(s0, s1, base) strtoull((s0), (s1), (base))
- # define ZEND_STRTOL_PTR strtoll
- # define ZEND_STRTOUL_PTR strtoull
- # define ZEND_ABS imaxabs
- # endif
- #else
- # define ZEND_STRTOL(s0, s1, base) strtol((s0), (s1), (base))
- # define ZEND_STRTOUL(s0, s1, base) strtoul((s0), (s1), (base))
- # define ZEND_LONG_FMT "%" PRId32
- # define ZEND_ULONG_FMT "%" PRIu32
- # define ZEND_XLONG_FMT "%" PRIx32
- # define ZEND_LONG_FMT_SPEC PRId32
- # define ZEND_ULONG_FMT_SPEC PRIu32
- # ifdef ZEND_WIN32
- # define ZEND_LTOA(i, s, len) _ltoa_s((i), (s), (len), 10)
- # define ZEND_ATOL(s) atol((s))
- # else
- # define ZEND_LTOA(i, s, len) \
- do { \
- int st = snprintf((s), (len), ZEND_LONG_FMT, (i)); \
- (s)[st] = '\0'; \
- } while (0)
- # define ZEND_ATOL(s) atol((s))
- # endif
- # define ZEND_STRTOL_PTR strtol
- # define ZEND_STRTOUL_PTR strtoul
- # define ZEND_ABS abs
- #endif
- #if SIZEOF_ZEND_LONG == 4
- # define MAX_LENGTH_OF_LONG 11
- # define LONG_MIN_DIGITS "2147483648"
- #elif SIZEOF_ZEND_LONG == 8
- # define MAX_LENGTH_OF_LONG 20
- # define LONG_MIN_DIGITS "9223372036854775808"
- #else
- # error "Unknown SIZEOF_ZEND_LONG"
- #endif
- static const char long_min_digits[] = LONG_MIN_DIGITS;
- #if SIZEOF_SIZE_T == 4
- # define ZEND_ADDR_FMT "0x%08zx"
- #elif SIZEOF_SIZE_T == 8
- # define ZEND_ADDR_FMT "0x%016zx"
- #else
- # error "Unknown SIZEOF_SIZE_T"
- #endif
- #endif /* ZEND_LONG_H */
|