From cba81d8058ddd2b20aebecc02598fd8bd45f99bf Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Sat, 6 Mar 2010 13:38:14 -0800 Subject: [PATCH] fix bug in complex printing: imaginary didn't have same format as real. add tests. R=rsc, ken2, ken3 CC=golang-dev https://golang.org/cl/261041 --- src/pkg/fmt/fmt_test.go | 29 +++++++++++++++++++++++++++++ src/pkg/fmt/format.go | 27 ++++++++++++++++++--------- src/pkg/fmt/print.go | 1 - 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/pkg/fmt/fmt_test.go b/src/pkg/fmt/fmt_test.go index 3752b35264..3f8674639a 100644 --- a/src/pkg/fmt/fmt_test.go +++ b/src/pkg/fmt/fmt_test.go @@ -119,6 +119,28 @@ var fmttests = []fmtTest{ fmtTest{"% .3g", -1.0, "-1"}, fmtTest{"% .3g", 1.0, " 1"}, + /* TODO: Enable when complex support is in all compilers + // complex values + fmtTest{"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"}, + fmtTest{"%+.3f", 0i, "(+0.000+0.000i)"}, + fmtTest{"%+.3g", 0i, "(+0+0i)"}, + fmtTest{"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"}, + fmtTest{"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, + fmtTest{"%+.3g", 1 + 2i, "(+1+2i)"}, + fmtTest{"%.3e", 0i, "(0.000e+00+0.000e+00i)"}, + fmtTest{"%.3f", 0i, "(0.000+0.000i)"}, + fmtTest{"%.3g", 0i, "(0+0i)"}, + fmtTest{"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"}, + fmtTest{"%.3f", 1 + 2i, "(1.000+2.000i)"}, + fmtTest{"%.3g", 1 + 2i, "(1+2i)"}, + fmtTest{"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"}, + fmtTest{"%.3f", -1 - 2i, "(-1.000-2.000i)"}, + fmtTest{"%.3g", -1 - 2i, "(-1-2i)"}, + fmtTest{"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"}, + fmtTest{"%+.3g", complex64(1 + 2i), "(+1+2i)"}, + fmtTest{"%+.3g", complex128(1 + 2i), "(+1+2i)"}, + */ + // erroneous formats fmtTest{"", 2, "?(extra int=2)"}, fmtTest{"%d", "hello", "%d(string=hello)"}, @@ -210,6 +232,13 @@ var fmttests = []fmtTest{ fmtTest{"%v", &array, "&[1 2 3 4 5]"}, fmtTest{"%v", &iarray, "&[1 hello 2.5 ]"}, + /* TODO: Enable when complex support is in all compilers + // complexes with %v + fmtTest{"%v", 1 + 2i, "(1+2i)"}, + fmtTest{"%v", complex64(1 + 2i), "(1+2i)"}, + fmtTest{"%v", complex128(1 + 2i), "(1+2i)"}, + */ + // structs fmtTest{"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`}, fmtTest{"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`}, diff --git a/src/pkg/fmt/format.go b/src/pkg/fmt/format.go index 1567609cf4..137c355bbb 100644 --- a/src/pkg/fmt/format.go +++ b/src/pkg/fmt/format.go @@ -43,13 +43,14 @@ type fmt struct { wid int prec int // flags - widPresent bool - precPresent bool - minus bool - plus bool - sharp bool - space bool - zero bool + widPresent bool + precPresent bool + minus bool + plus bool + sharp bool + space bool + zero bool + preserveFlags bool // don't clear flags after this print; used to carry over in complex prints } func (f *fmt) clearflags() { @@ -119,7 +120,9 @@ func (f *fmt) pad(b []byte) { if right > 0 { f.writePadding(right, padding) } - f.clearflags() + if !f.preserveFlags { + f.clearflags() + } } // append s to buf, padded on left (w > 0) or right (w < 0 or f.minus). @@ -137,7 +140,9 @@ func (f *fmt) padString(s string) { if right > 0 { f.writePadding(right, padding) } - f.clearflags() + if !f.preserveFlags { + f.clearflags() + } } func putint(buf []byte, base, val uint64, digits string) int { @@ -425,6 +430,7 @@ func (f *fmt) fmt_fb32(v float32) { f.padString(strconv.Ftoa32(v, 'b', 0)) } func (f *fmt) fmt_c64(v complex64, fmt_x byte) { f.buf.WriteByte('(') r := real(v) + f.preserveFlags = true for i := 0; ; i++ { switch fmt_x { case 'e': @@ -438,6 +444,7 @@ func (f *fmt) fmt_c64(v complex64, fmt_x byte) { case 'G': f.fmt_G32(r) } + f.preserveFlags = false if i != 0 { break } @@ -452,6 +459,7 @@ func (f *fmt) fmt_c64(v complex64, fmt_x byte) { func (f *fmt) fmt_c128(v complex128, fmt_x byte) { f.buf.WriteByte('(') r := real(v) + f.preserveFlags = true for i := 0; ; i++ { switch fmt_x { case 'e': @@ -465,6 +473,7 @@ func (f *fmt) fmt_c128(v complex128, fmt_x byte) { case 'G': f.fmt_G64(r) } + f.preserveFlags = false if i != 0 { break } diff --git a/src/pkg/fmt/print.go b/src/pkg/fmt/print.go index 23f924b60f..71a4a662ab 100644 --- a/src/pkg/fmt/print.go +++ b/src/pkg/fmt/print.go @@ -927,7 +927,6 @@ func (p *pp) doprintf(format string, a []interface{}) { p.fmt.fmt_c64(v, 'e') } else if v, ok := getComplex128(field); ok { p.fmt.fmt_c128(v, 'e') - } else { goto badtype }