xref: /php-src/ext/bcmath/libbcmath/src/private.h (revision 8a4a3046)
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