Skip to content

Commit 654d094

Browse files
committed
Merge branch 'master' of github.com:owlient/phpredis into serializer
2 parents 6013b13 + 9dd844d commit 654d094

File tree

2 files changed

+21
-20
lines changed

2 files changed

+21
-20
lines changed

library.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <zend_exceptions.h>
1111
#include "php_redis.h"
1212
#include "library.h"
13+
#include <ext/standard/php_math.h>
1314

1415
extern zend_class_entry *redis_ce;
1516
extern zend_class_entry *redis_exception_ce;
@@ -189,17 +190,13 @@ integer_length(int i) {
189190
}
190191

191192
int
192-
double_length(double d, int *has_F) {
193+
double_length(double d) {
193194
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;
203200
}
204201

205202

@@ -256,8 +253,8 @@ redis_cmd_format_static(char **ret, char *keyword, char *format, ...) {
256253
case 'f':
257254
/* use spprintf here */
258255
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;
261258
if(stage == 1) {
262259
memcpy((*ret) + total, "$", 1); /* dollar */
263260
total++;
@@ -268,11 +265,10 @@ redis_cmd_format_static(char **ret, char *keyword, char *format, ...) {
268265
memcpy((*ret) + total, _NL, 2); /* CRLF */
269266
total += 2;
270267

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);
276272
total += sz;
277273

278274
memcpy((*ret) + total, _NL, 2); /* CRLF */
@@ -362,9 +358,14 @@ redis_cmd_format(char **ret, char *format, ...) {
362358
case 'f':
363359
/* use spprintf here */
364360
dbl = va_arg(ap, double);
365-
double_len = spprintf(&double_str, 0, "%F", dbl);
361+
double_len = double_length(dbl);
362+
366363
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);
368369
}
369370
total += double_len;
370371
efree(double_str);

library.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
void add_constant_long(zend_class_entry *ce, char *name, int value);
22
int integer_length(int i);
3-
int double_length(double d, int *has_F);
3+
int double_length(double d);
44
int redis_cmd_format(char **ret, char *format, ...);
55
int redis_cmd_format_static(char **ret, char *keyword, char *format, ...);
66

0 commit comments

Comments
 (0)