1 /* private.h: bcmath library header. */ 2 /* 3 Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. 4 Copyright (C) 2000 Philip A. Nelson 5 6 This library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2 of the License, or (at your option) any later version. 10 11 This library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. (LICENSE) 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with this library; if not, write to: 18 19 The Free Software Foundation, Inc. 20 59 Temple Place, Suite 330 21 Boston, MA 02111-1307 USA. 22 23 You may contact the author by: 24 e-mail: philnelson@acm.org 25 us-mail: Philip A. Nelson 26 Computer Science Department, 9062 27 Western Washington University 28 Bellingham, WA 98226-9062 29 30 *************************************************************************/ 31 32 /* "Private" routines to bcmath. */ 33 34 #include <stdbool.h> 35 #include <stddef.h> 36 #include "zend_portability.h" 37 38 /* This will be 0x01010101 for 32-bit and 0x0101010101010101 for 64-bit */ 39 #define SWAR_ONES (~((size_t) 0) / 0xFF) 40 /* This repeats a byte `x` into an entire 32/64-bit word. 41 * Example: SWAR_REPEAT(0xAB) will be 0xABABABAB for 32-bit and 0xABABABABABABABAB for 64-bit. */ 42 #define SWAR_REPEAT(x) (SWAR_ONES * (x)) 43 44 #if SIZEOF_SIZE_T >= 8 45 # define BC_BSWAP(u) ZEND_BYTES_SWAP64(u) 46 typedef uint64_t BC_VECTOR; 47 # define BC_VECTOR_SIZE 8 48 /* The boundary number is computed from BASE ** BC_VECTOR_SIZE */ 49 # define BC_VECTOR_BOUNDARY_NUM (BC_VECTOR) 100000000 50 #else 51 # define BC_BSWAP(u) ZEND_BYTES_SWAP32(u) 52 typedef uint32_t BC_VECTOR; 53 # define BC_VECTOR_SIZE 4 54 /* The boundary number is computed from BASE ** BC_VECTOR_SIZE */ 55 # define BC_VECTOR_BOUNDARY_NUM (BC_VECTOR) 10000 56 #endif 57 58 #ifdef WORDS_BIGENDIAN 59 # define BC_LITTLE_ENDIAN 0 60 #else 61 # define BC_LITTLE_ENDIAN 1 62 #endif 63 64 /* 65 * Adding more than this many times may cause uint32_t/uint64_t to overflow. 66 * Typically this is 1844 for 64bit and 42 for 32bit. 67 */ 68 #define BC_VECTOR_NO_OVERFLOW_ADD_COUNT (~((BC_VECTOR) 0) / (BC_VECTOR_BOUNDARY_NUM * BC_VECTOR_BOUNDARY_NUM)) 69 70 71 /* routines */ 72 bcmath_compare_result _bc_do_compare (bc_num n1, bc_num n2, size_t scale, bool use_sign); 73 bc_num _bc_do_add (bc_num n1, bc_num n2); 74 bc_num _bc_do_sub (bc_num n1, bc_num n2); 75 void _bc_rm_leading_zeros (bc_num num); 76