10
10
#include <zend_exceptions.h>
11
11
#include "php_redis.h"
12
12
#include "library.h"
13
+ #include <ext/standard/php_math.h>
13
14
14
15
extern zend_class_entry * redis_ce ;
15
16
extern zend_class_entry * redis_exception_ce ;
@@ -189,17 +190,13 @@ integer_length(int i) {
189
190
}
190
191
191
192
int
192
- double_length (double d , int * has_F ) {
193
+ double_length (double d ) {
193
194
char * s ;
194
- int ret = spprintf (& s , 0 , "%F" , d );
195
- * has_F = 1 ;
196
- if (ret == 2 && strncmp (s , "%F" , 2 ) == 0 ) { /* we don't have the 'F' format, get back to 'f' */
197
- efree (s );
198
- ret = spprintf (& s , 0 , "%f" , d );
199
- * has_F = 0 ;
200
- }
201
- efree (s );
202
- return ret ;
195
+ int ret ;
196
+ s = _php_math_number_format (d , 8 , '.' , '\x00' );
197
+ ret = strlen (s );
198
+ efree (s );
199
+ return ret ;
203
200
}
204
201
205
202
@@ -256,8 +253,8 @@ redis_cmd_format_static(char **ret, char *keyword, char *format, ...) {
256
253
case 'f' :
257
254
/* use spprintf here */
258
255
dbl = va_arg (ap , double );
259
- int has_F ;
260
- sz = double_length ( dbl , & has_F ) ;
256
+ sz = double_length ( dbl ) ;
257
+ char * dbl_str ;
261
258
if (stage == 1 ) {
262
259
memcpy ((* ret ) + total , "$" , 1 ); /* dollar */
263
260
total ++ ;
@@ -268,11 +265,10 @@ redis_cmd_format_static(char **ret, char *keyword, char *format, ...) {
268
265
memcpy ((* ret ) + total , _NL , 2 ); /* CRLF */
269
266
total += 2 ;
270
267
271
- if (has_F ) {
272
- sprintf ((* ret ) + total , "%F" , dbl ); /* float */
273
- } else {
274
- sprintf ((* ret ) + total , "%f" , dbl ); /* float */
275
- }
268
+ /* float value */
269
+ dbl_str = _php_math_number_format (dbl , 8 , '.' , '\x00' );
270
+ memcpy ((* ret ) + total , dbl_str , sz );
271
+ efree (dbl_str );
276
272
total += sz ;
277
273
278
274
memcpy ((* ret ) + total , _NL , 2 ); /* CRLF */
@@ -362,9 +358,14 @@ redis_cmd_format(char **ret, char *format, ...) {
362
358
case 'f' :
363
359
/* use spprintf here */
364
360
dbl = va_arg (ap , double );
365
- double_len = spprintf (& double_str , 0 , "%F" , dbl );
361
+ double_len = double_length (dbl );
362
+
366
363
if (stage == 1 ) {
367
- memcpy ((* ret ) + total , double_str , double_len );
364
+ /* float value */
365
+ char * dbl_str = _php_math_number_format (dbl , 8 , '.' , '\x00' );
366
+ memcpy ((* ret ) + total , dbl_str , sz );
367
+ total += sz ;
368
+ efree (dbl_str );
368
369
}
369
370
total += double_len ;
370
371
efree (double_str );
0 commit comments