summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2007-02-21 14:25:27 +0000
committerAntony Dovgal <tony2001@php.net>2007-02-21 14:25:27 +0000
commitbccae9a134731ee32a8b1ef4a13afa92e8af4856 (patch)
treeb8c90ebe37a042a016367ca073655d0ed31e5739
parent149dd625bef9a76a5ac5d7652bab7d0b490b3f9c (diff)
downloadphp-git-bccae9a134731ee32a8b1ef4a13afa92e8af4856.tar.gz
MFH: fix #40576 (double values are truncated to 6 decimal digits when encoding)
-rw-r--r--NEWS2
-rw-r--r--ext/xmlrpc/libxmlrpc/xml_to_xmlrpc.c11
-rw-r--r--ext/xmlrpc/tests/bug40576.phpt72
3 files changed, 82 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 21346e22c0..61b90265a5 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,8 @@ PHP NEWS
- Added --ri switch to CLI which allows to check extension information. (Marcus)
- Added tidyNode::getParent() method (John, Nuno)
- Fixed zend_llist_remove_tail (Michael Wallner, Dmitry)
+- Fixed bug #40576 (double values are truncated to 6 decimal digits when
+ encoding). (Tony)
- Fixed bug #40560 (DIR functions do not work on root UNC path). (Dmitry)
- Fixed bug #40548 (SplFileInfo::getOwner/getGroup give a warning on broken
symlink). (Marcus)
diff --git a/ext/xmlrpc/libxmlrpc/xml_to_xmlrpc.c b/ext/xmlrpc/libxmlrpc/xml_to_xmlrpc.c
index 4caf9e3afd..78643754cd 100644
--- a/ext/xmlrpc/libxmlrpc/xml_to_xmlrpc.c
+++ b/ext/xmlrpc/libxmlrpc/xml_to_xmlrpc.c
@@ -36,6 +36,8 @@ static const char rcsid[] = "#(@) $Id$";
#ifdef _WIN32
#include "xmlrpc_win32.h"
#endif
+#include "php.h"
+#include "main/snprintf.h"
#include <string.h>
#include <stdlib.h>
#include "xml_to_xmlrpc.h"
@@ -225,9 +227,12 @@ xml_element* XMLRPC_to_xml_element_worker(XMLRPC_VALUE current_vector, XMLRPC_VA
simplestring_add(&elem_val->text, buf);
break;
case xmlrpc_double:
- elem_val->name = strdup(ELEM_DOUBLE);
- snprintf(buf, BUF_SIZE, "%f", XMLRPC_GetValueDouble(node));
- simplestring_add(&elem_val->text, buf);
+ {
+ TSRMLS_FETCH();
+ elem_val->name = strdup(ELEM_DOUBLE);
+ ap_php_snprintf(buf, BUF_SIZE, "%.*G", (int) EG(precision), XMLRPC_GetValueDouble(node));
+ simplestring_add(&elem_val->text, buf);
+ }
break;
case xmlrpc_datetime:
elem_val->name = strdup(ELEM_DATETIME);
diff --git a/ext/xmlrpc/tests/bug40576.phpt b/ext/xmlrpc/tests/bug40576.phpt
new file mode 100644
index 0000000000..2060cb4fcc
--- /dev/null
+++ b/ext/xmlrpc/tests/bug40576.phpt
@@ -0,0 +1,72 @@
+--TEST--
+Bug #40576 (double values are truncated to 6 decimal digits when encoding)
+--INI--
+precision=12
+--FILE--
+<?php
+
+var_dump(xmlrpc_encode(1.123456789));
+var_dump(xmlrpc_encode(11234567891010));
+var_dump(xmlrpc_encode(11234567));
+var_dump(xmlrpc_encode(""));
+var_dump(xmlrpc_encode("test"));
+var_dump(xmlrpc_encode("1.22222222222222222222222"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+string(125) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <double>1.123456789</double>
+ </value>
+</param>
+</params>
+"
+string(128) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <double>11234567891000</double>
+ </value>
+</param>
+</params>
+"
+string(116) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <int>11234567</int>
+ </value>
+</param>
+</params>
+"
+string(106) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <string/>
+ </value>
+</param>
+</params>
+"
+string(118) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <string>test</string>
+ </value>
+</param>
+</params>
+"
+string(139) "<?xml version="1.0" encoding="utf-8"?>
+<params>
+<param>
+ <value>
+ <string>1.22222222222222222222222</string>
+ </value>
+</param>
+</params>
+"
+Done