diff options
Diffstat (limited to 'libgo/go/fmt/format.go')
-rw-r--r-- | libgo/go/fmt/format.go | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/libgo/go/fmt/format.go b/libgo/go/fmt/format.go index d6da8ae..74e600c 100644 --- a/libgo/go/fmt/format.go +++ b/libgo/go/fmt/format.go @@ -89,17 +89,17 @@ func (f *fmt) writePadding(n int) { // pad appends b to f.buf, padded on left (!f.minus) or right (f.minus). func (f *fmt) pad(b []byte) { if !f.widPresent || f.wid == 0 { - f.buf.Write(b) + f.buf.write(b) return } width := f.wid - utf8.RuneCount(b) if !f.minus { // left padding f.writePadding(width) - f.buf.Write(b) + f.buf.write(b) } else { // right padding - f.buf.Write(b) + f.buf.write(b) f.writePadding(width) } } @@ -107,17 +107,17 @@ func (f *fmt) pad(b []byte) { // padString appends s to f.buf, padded on left (!f.minus) or right (f.minus). func (f *fmt) padString(s string) { if !f.widPresent || f.wid == 0 { - f.buf.WriteString(s) + f.buf.writeString(s) return } width := f.wid - utf8.RuneCountInString(s) if !f.minus { // left padding f.writePadding(width) - f.buf.WriteString(s) + f.buf.writeString(s) } else { // right padding - f.buf.WriteString(s) + f.buf.writeString(s) f.writePadding(width) } } @@ -191,7 +191,7 @@ func (f *fmt) fmtUnicode(u uint64) { } // fmtInteger formats signed and unsigned integers. -func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { +func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, verb rune, digits string) { negative := isSigned && int64(u) < 0 if negative { u = -u @@ -275,6 +275,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { // Various prefixes: 0x, -, etc. if f.sharp { switch base { + case 2: + // Add a leading 0b. + i-- + buf[i] = 'b' + i-- + buf[i] = '0' case 8: if buf[i] != '0' { i-- @@ -288,6 +294,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { buf[i] = '0' } } + if verb == 'O' { + i-- + buf[i] = 'o' + i-- + buf[i] = '0' + } if negative { i-- @@ -510,7 +522,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { if f.sharp && verb != 'b' { digits := 0 switch verb { - case 'v', 'g', 'G': + case 'v', 'g', 'G', 'x': digits = prec // If no precision is set explicitly use a precision of 6. if digits == -1 { @@ -519,8 +531,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } // Buffer pre-allocated with enough room for - // exponent notations of the form "e+123". - var tailBuf [5]byte + // exponent notations of the form "e+123" or "p-1023". + var tailBuf [6]byte tail := tailBuf[:0] hasDecimalPoint := false @@ -529,9 +541,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true - case 'e', 'E': + case 'p', 'P': tail = append(tail, num[i:]...) num = num[:i] + case 'e', 'E': + if verb != 'x' && verb != 'X' { + tail = append(tail, num[i:]...) + num = num[:i] + break + } + fallthrough default: digits-- } @@ -550,9 +569,9 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { // If we're zero padding to the left we want the sign before the leading zeros. // Achieve this by writing the sign out and then padding the unsigned number. if f.zero && f.widPresent && f.wid > len(num) { - f.buf.WriteByte(num[0]) + f.buf.writeByte(num[0]) f.writePadding(f.wid - len(num)) - f.buf.Write(num[1:]) + f.buf.write(num[1:]) return } f.pad(num) |