]> Cypherpunks repositories - gostls13.git/commitdiff
fix bug in complex printing: imaginary didn't have same format as real.
authorRob Pike <r@golang.org>
Sat, 6 Mar 2010 21:38:14 +0000 (13:38 -0800)
committerRob Pike <r@golang.org>
Sat, 6 Mar 2010 21:38:14 +0000 (13:38 -0800)
add tests.

R=rsc, ken2, ken3
CC=golang-dev
https://golang.org/cl/261041

src/pkg/fmt/fmt_test.go
src/pkg/fmt/format.go
src/pkg/fmt/print.go

index 3752b35264d6790e234c69cc546f2114da6dae6d..3f8674639af8f9d44ef7f815268bb6860d2fb1ae 100644 (file)
@@ -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 <nil>]"},
 
+       /* 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]}`},
index 1567609cf4a586158fe2cf20d3b3bc68e6c4685f..137c355bbbad9df17ca97cac3778e636b6ed2bc5 100644 (file)
@@ -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
                }
index 23f924b60f9c68960fc46a7a077d620ce6a42dbc..71a4a662ab16b4d3f1a8ed21c90c3327e2b0b21c 100644 (file)
@@ -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
                        }