xref: /PHP-7.4/ext/bcmath/libbcmath/src/bcmath.h (revision bcb89c75)
1 /* bcmath.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 #ifndef _BCMATH_H_
33 #define _BCMATH_H_
34 
35 typedef enum {PLUS, MINUS} sign;
36 
37 typedef struct bc_struct *bc_num;
38 
39 typedef struct bc_struct
40     {
41       sign  n_sign;
42       int   n_len;	/* The number of digits before the decimal point. */
43       int   n_scale;	/* The number of digits after the decimal point. */
44       int   n_refs;     /* The number of pointers to this number. */
45       char *n_ptr;	/* The pointer to the actual storage.
46 			   If NULL, n_value points to the inside of
47 			   another number (bc_multiply...) and should
48 			   not be "freed." */
49       char *n_value;	/* The number. Not zero char terminated.
50 			   May not point to the same place as n_ptr as
51 			   in the case of leading zeros generated. */
52     } bc_struct;
53 
54 #ifdef HAVE_CONFIG_H
55 #include "config.h"
56 #endif
57 
58 #include "php.h"
59 #include "../../php_bcmath.h"
60 
61 /* The base used in storing the numbers in n_value above.
62    Currently this MUST be 10. */
63 
64 #define BASE 10
65 
66 /*  Some useful macros and constants. */
67 
68 #define CH_VAL(c)     (c - '0')
69 #define BCD_CHAR(d)   (d + '0')
70 
71 #ifdef MIN
72 #undef MIN
73 #undef MAX
74 #endif
75 #define MAX(a, b)      ((a)>(b)?(a):(b))
76 #define MIN(a, b)      ((a)>(b)?(b):(a))
77 #define ODD(a)        ((a)&1)
78 
79 #ifndef TRUE
80 #define TRUE 1
81 #define FALSE 0
82 #endif
83 
84 #ifndef LONG_MAX
85 #define LONG_MAX 0x7ffffff
86 #endif
87 
88 
89 /* Function Prototypes */
90 
91 /* Define the _PROTOTYPE macro if it is needed. */
92 
93 #ifndef _PROTOTYPE
94 #if defined(__STDC__) || defined(PHP_WIN32) && defined(__clang__)
95 #define _PROTOTYPE(func, args) func args
96 #else
97 #define _PROTOTYPE(func, args) func()
98 #endif
99 #endif
100 
101 _PROTOTYPE(void bc_init_numbers, (void));
102 
103 _PROTOTYPE(bc_num _bc_new_num_ex, (int length, int scale, int persistent));
104 
105 _PROTOTYPE(void _bc_free_num_ex, (bc_num *num, int persistent));
106 
107 _PROTOTYPE(bc_num bc_copy_num, (bc_num num));
108 
109 _PROTOTYPE(void bc_init_num, (bc_num *num));
110 
111 _PROTOTYPE(int bc_str2num, (bc_num *num, char *str, int scale));
112 
113 _PROTOTYPE(zend_string *bc_num2str_ex, (bc_num num, int scale));
114 
115 _PROTOTYPE(void bc_int2num, (bc_num *num, int val));
116 
117 _PROTOTYPE(long bc_num2long, (bc_num num));
118 
119 _PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2));
120 
121 _PROTOTYPE(char bc_is_zero, (bc_num num));
122 
123 _PROTOTYPE(char bc_is_zero_for_scale, (bc_num num, int scale));
124 
125 _PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale));
126 
127 _PROTOTYPE(char bc_is_neg, (bc_num num));
128 
129 _PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
130 
131 _PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
132 
133 _PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale));
134 
135 _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale));
136 
137 _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result,
138 			   int scale));
139 
140 _PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot,
141 			   bc_num *rem, int scale));
142 
143 _PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod,
144 			     bc_num *result, int scale));
145 
146 _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result,
147 			   int scale));
148 
149 _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale));
150 
151 _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int),
152 			     int leading_zero));
153 
154 /* Prototypes needed for external utility routines. */
155 
156 _PROTOTYPE(void bc_out_of_memory, (void));
157 
158 #define bc_new_num(length, scale)	_bc_new_num_ex((length), (scale), 0)
159 #define bc_free_num(num)			_bc_free_num_ex((num), 0)
160 #define bc_num2str(num)				bc_num2str_ex((num), (num->n_scale))
161 
162 #endif
163