summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-21 21:58:09 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2012-01-21 21:58:09 +0000
commit34f8315228dab80ef1c7a47c334cdc42dd6b96f0 (patch)
treef00c47026446ae7a59a02e381565d670a46b73ab /libgo
parent1d3b74073717938c2a802ee0a37d582ba04fe255 (diff)
downloadgcc-34f8315228dab80ef1c7a47c334cdc42dd6b96f0.tar.gz
runtime: Make builtin print exactly match gc builtin print.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183378 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/go-print.c97
1 files changed, 87 insertions, 10 deletions
diff --git a/libgo/runtime/go-print.c b/libgo/runtime/go-print.c
index bf3c2af7128..e4981c042df 100644
--- a/libgo/runtime/go-print.c
+++ b/libgo/runtime/go-print.c
@@ -4,6 +4,7 @@
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file. */
+#include <math.h>
#include <stdint.h>
#include <stdio.h>
@@ -46,20 +47,95 @@ __go_print_int64 (int64_t val)
}
void
-__go_print_double (double val)
+__go_print_double (double v)
{
- fprintf (stderr, "%.24g", val);
+ char buf[20];
+ int e, s, i, n;
+ double h;
+
+ if (isnan (v))
+ {
+ fputs ("NaN", stderr);
+ return;
+ }
+ if (isinf (v))
+ {
+ putc (v < 0 ? '-' : '+', stderr);
+ fputs ("Inf", stderr);
+ return;
+ }
+
+ /* The number of digits printed. */
+ n = 7;
+ /* The exponent. */
+ e = 0;
+ /* The sign. */
+ s = 0;
+ if (v != 0)
+ {
+ if (v < 0)
+ {
+ v = -v;
+ s = 1;
+ }
+
+ /* Normalize. */
+ while (v >= 10)
+ {
+ ++e;
+ v /= 10;
+ }
+ while (v < 1)
+ {
+ --e;
+ v *= 10;
+ }
+
+ /* Round. */
+ h = 5;
+ for (i = 0; i < n; ++i)
+ h /= 10;
+
+ v += h;
+ if (v >= 10)
+ {
+ ++e;
+ v /= 10;
+ }
+ }
+
+ /* The format is +d.dddd+edd. */
+ buf[0] = s ? '-' : '+';
+ for (i = 0; i < n; ++i)
+ {
+ int d;
+
+ d = v;
+ buf[i + 2] = d + '0';
+ v -= d;
+ v *= 10;
+ }
+ buf[1] = buf[2];
+ buf[2] = '.';
+
+ buf[n + 2] = 'e';
+ buf[n + 3] = e < 0 ? '-' : '+';
+ if (e < 0)
+ e = - e;
+ buf[n + 4] = e / 100 + '0';
+ buf[n + 5] = (e / 10) % 10 + '0';
+ buf[n + 6] = e % 10 + '0';
+ buf[n + 7] = '\0';
+ fputs (buf, stderr);
}
void
__go_print_complex (__complex double val)
{
- fprintf (stderr, "(%.24g%s%.24gi)",
- __builtin_creal (val),
- (__builtin_cimag (val) >= 0 || __builtin_isnan (__builtin_cimag(val))
- ? "+"
- : ""),
- __builtin_cimag (val));
+ putc ('(', stderr);
+ __go_print_double (__builtin_creal (val));
+ __go_print_double (__builtin_cimag (val));
+ fputs ("i)", stderr);
}
void
@@ -71,7 +147,7 @@ __go_print_bool (_Bool val)
void
__go_print_pointer (void *val)
{
- fprintf (stderr, "%p", val);
+ fprintf (stderr, "0x%lx", (unsigned long) (uintptr_t) val);
}
void
@@ -89,5 +165,6 @@ __go_print_interface (struct __go_interface i)
void
__go_print_slice (struct __go_open_array val)
{
- fprintf (stderr, "[%d/%d]%p", val.__count, val.__capacity, val.__values);
+ fprintf (stderr, "[%d/%d]", val.__count, val.__capacity);
+ __go_print_pointer (val.__values);
}