php-internal-docs
8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
num2str.c
Go to the documentation of this file.
1
/* num2str.c: bcmath library file. */
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
#include "
bcmath.h
"
33
#include "
convert.h
"
34
#include "
zend_string.h
"
35
36
/* Convert a numbers to a string. Base 10 only.*/
37
zend_string
*
bc_num2str_ex
(
bc_num
num,
size_t
scale)
38
{
39
zend_string
*str;
40
char
*sptr;
41
size_t
index;
42
bool
signch;
43
size_t
min_scale =
MIN
(num->
n_scale
, scale);
44
45
/* Number of sign chars. */
46
signch = num->
n_sign
!=
PLUS
&& !
bc_is_zero_for_scale
(num, min_scale);
47
/* Allocate the string memory. */
48
if
(scale > 0) {
49
str = zend_string_alloc(num->
n_len
+ scale + signch + 1, 0);
50
}
else
{
51
str = zend_string_alloc(num->
n_len
+ signch, 0);
52
}
53
54
/* The negative sign if needed. */
55
sptr =
ZSTR_VAL
(str);
56
if
(signch) *sptr++ =
'-'
;
57
58
/* Load the whole number. */
59
const
char
*nptr = num->
n_value
;
60
sptr =
bc_copy_and_toggle_bcd
(sptr, nptr, nptr + num->
n_len
);
61
nptr += num->
n_len
;
62
63
/* Now the fraction. */
64
if
(scale > 0) {
65
*sptr++ =
'.'
;
66
sptr =
bc_copy_and_toggle_bcd
(sptr, nptr, nptr + min_scale);
67
for
(index = num->
n_scale
; index < scale; index++) {
68
*sptr++ =
BCD_CHAR
(0);
69
}
70
}
71
72
/* Terminate the string and return it! */
73
*sptr =
'\0'
;
74
ZSTR_LEN
(str) = sptr - (
char
*)
ZSTR_VAL
(str);
75
return
str;
76
}
bcmath.h
bc_is_zero_for_scale
bool bc_is_zero_for_scale(bc_num num, size_t scale)
Definition
zero.c:38
BCD_CHAR
#define BCD_CHAR(d)
Definition
bcmath.h:68
bc_num
struct bc_struct * bc_num
Definition
bcmath.h:39
PLUS
@ PLUS
Definition
bcmath.h:37
bc_copy_and_toggle_bcd
char * bc_copy_and_toggle_bcd(char *restrict dest, const char *source, const char *source_end)
Definition
convert.c:24
convert.h
bc_num2str_ex
zend_string * bc_num2str_ex(bc_num num, size_t scale)
Definition
num2str.c:37
bc_struct::n_sign
sign n_sign
Definition
bcmath.h:46
bc_struct::n_len
size_t n_len
Definition
bcmath.h:42
bc_struct::n_scale
size_t n_scale
Definition
bcmath.h:43
bc_struct::n_value
char * n_value
Definition
bcmath.h:44
zend_string
struct _zend_string zend_string
Definition
zend_map_ptr.h:24
MIN
#define MIN(a, b)
Definition
zend_portability.h:460
zend_string.h
ZSTR_VAL
#define ZSTR_VAL(zstr)
Definition
zend_string.h:68
ZSTR_LEN
#define ZSTR_LEN(zstr)
Definition
zend_string.h:69
ext
bcmath
libbcmath
src
num2str.c
Generated on Sat Aug 23 2025 01:46:05 for php-internal-docs by
1.13.2