package fmt
import (
)
const (
commaSpaceString = ", "
nilAngleString = "<nil>"
nilParenString = "(nil)"
nilString = "nil"
mapString = "map["
percentBangString = "%!"
missingString = "(MISSING)"
badIndexString = "(BADINDEX)"
panicString = "(PANIC="
extraString = "%!(EXTRA "
badWidthString = "%!(BADWIDTH)"
badPrecString = "%!(BADPREC)"
noVerbString = "%!(NOVERB)"
invReflectString = "<invalid reflect.Value>"
)
type State interface {
Write(b []byte) (n int, err error)
Width() (wid int, ok bool)
Precision() (prec int, ok bool)
Flag(c int) bool
}
type Formatter interface {
Format(f State, verb rune)
}
type Stringer interface {
String() string
}
type GoStringer interface {
GoString() string
}
type buffer []byte
func ( *buffer) ( []byte) {
* = append(*, ...)
}
func ( *buffer) ( string) {
* = append(*, ...)
}
func ( *buffer) ( byte) {
* = append(*, )
}
func ( *buffer) ( rune) {
if < utf8.RuneSelf {
* = append(*, byte())
return
}
:= *
:= len()
for +utf8.UTFMax > cap() {
= append(, 0)
}
:= utf8.EncodeRune([:+utf8.UTFMax], )
* = [:+]
}
type pp struct {
buf buffer
arg interface{}
value reflect.Value
fmt fmt
reordered bool
goodArgNum bool
panicking bool
erroring bool
wrapErrs bool
wrappedErr error
}
var ppFree = sync.Pool{
New: func() interface{} { return new(pp) },
}
func () *pp {
:= ppFree.Get().(*pp)
.panicking = false
.erroring = false
.wrapErrs = false
.fmt.init(&.buf)
return
}
func ( *pp) () {
if cap(.buf) > 64<<10 {
return
}
.buf = .buf[:0]
.arg = nil
.value = reflect.Value{}
.wrappedErr = nil
ppFree.Put()
}
func ( *pp) () ( int, bool) { return .fmt.wid, .fmt.widPresent }
func ( *pp) () ( int, bool) { return .fmt.prec, .fmt.precPresent }
func ( *pp) ( int) bool {
switch {
case '-':
return .fmt.minus
case '+':
return .fmt.plus || .fmt.plusV
case '#':
return .fmt.sharp || .fmt.sharpV
case ' ':
return .fmt.space
case '0':
return .fmt.zero
}
return false
}
func ( *pp) ( []byte) ( int, error) {
.buf.write()
return len(), nil
}
func ( *pp) ( string) ( int, error) {
.buf.writeString()
return len(), nil
}
func ( io.Writer, string, ...interface{}) ( int, error) {
:= newPrinter()
.doPrintf(, )
, = .Write(.buf)
.free()
return
}
func ( string, ...interface{}) ( int, error) {
return Fprintf(os.Stdout, , ...)
}
func ( string, ...interface{}) string {
:= newPrinter()
.doPrintf(, )
:= string(.buf)
.free()
return
}
func ( io.Writer, ...interface{}) ( int, error) {
:= newPrinter()
.doPrint()
, = .Write(.buf)
.free()
return
}
func ( ...interface{}) ( int, error) {
return Fprint(os.Stdout, ...)
}
func ( ...interface{}) string {
:= newPrinter()
.doPrint()
:= string(.buf)
.free()
return
}
func ( io.Writer, ...interface{}) ( int, error) {
:= newPrinter()
.doPrintln()
, = .Write(.buf)
.free()
return
}
func ( ...interface{}) ( int, error) {
return Fprintln(os.Stdout, ...)
}
func ( ...interface{}) string {
:= newPrinter()
.doPrintln()
:= string(.buf)
.free()
return
}
func ( reflect.Value, int) reflect.Value {
:= .Field()
if .Kind() == reflect.Interface && !.IsNil() {
= .Elem()
}
return
}
func ( int) bool {
const int = 1e6
return > || < -
}
func ( string, , int) ( int, bool, int) {
if >= {
return 0, false,
}
for = ; < && '0' <= [] && [] <= '9'; ++ {
if tooLarge() {
return 0, false,
}
= *10 + int([]-'0')
= true
}
return
}
func ( *pp) ( reflect.Value) {
if !.IsValid() {
.buf.writeString(nilAngleString)
return
}
.buf.writeByte('?')
.buf.writeString(.Type().String())
.buf.writeByte('?')
}
func ( *pp) ( rune) {
.erroring = true
.buf.writeString(percentBangString)
.buf.writeRune()
.buf.writeByte('(')
switch {
case .arg != nil:
.buf.writeString(reflect.TypeOf(.arg).String())
.buf.writeByte('=')
.printArg(.arg, 'v')
case .value.IsValid():
.buf.writeString(.value.Type().String())
.buf.writeByte('=')
.printValue(.value, 'v', 0)
default:
.buf.writeString(nilAngleString)
}
.buf.writeByte(')')
.erroring = false
}
func ( *pp) ( bool, rune) {
switch {
case 't', 'v':
.fmt.fmtBoolean()
default:
.badVerb()
}
}
func ( *pp) ( uint64, bool) {
:= .fmt.sharp
.fmt.sharp =
.fmt.fmtInteger(, 16, unsigned, 'v', ldigits)
.fmt.sharp =
}
func ( *pp) ( uint64, bool, rune) {
switch {
case 'v':
if .fmt.sharpV && ! {
.fmt0x64(, true)
} else {
.fmt.fmtInteger(, 10, , , ldigits)
}
case 'd':
.fmt.fmtInteger(, 10, , , ldigits)
case 'b':
.fmt.fmtInteger(, 2, , , ldigits)
case 'o', 'O':
.fmt.fmtInteger(, 8, , , ldigits)
case 'x':
.fmt.fmtInteger(, 16, , , ldigits)
case 'X':
.fmt.fmtInteger(, 16, , , udigits)
case 'c':
.fmt.fmtC()
case 'q':
.fmt.fmtQc()
case 'U':
.fmt.fmtUnicode()
default:
.badVerb()
}
}
func ( *pp) ( float64, int, rune) {
switch {
case 'v':
.fmt.fmtFloat(, , 'g', -1)
case 'b', 'g', 'G', 'x', 'X':
.fmt.fmtFloat(, , , -1)
case 'f', 'e', 'E':
.fmt.fmtFloat(, , , 6)
case 'F':
.fmt.fmtFloat(, , 'f', 6)
default:
.badVerb()
}
}
func ( *pp) ( complex128, int, rune) {
switch {
case 'v', 'b', 'g', 'G', 'x', 'X', 'f', 'F', 'e', 'E':
:= .fmt.plus
.buf.writeByte('(')
.fmtFloat(real(), /2, )
.fmt.plus = true
.fmtFloat(imag(), /2, )
.buf.writeString("i)")
.fmt.plus =
default:
.badVerb()
}
}
func ( *pp) ( string, rune) {
switch {
case 'v':
if .fmt.sharpV {
.fmt.fmtQ()
} else {
.fmt.fmtS()
}
case 's':
.fmt.fmtS()
case 'x':
.fmt.fmtSx(, ldigits)
case 'X':
.fmt.fmtSx(, udigits)
case 'q':
.fmt.fmtQ()
default:
.badVerb()
}
}
func ( *pp) ( []byte, rune, string) {
switch {
case 'v', 'd':
if .fmt.sharpV {
.buf.writeString()
if == nil {
.buf.writeString(nilParenString)
return
}
.buf.writeByte('{')
for , := range {
if > 0 {
.buf.writeString(commaSpaceString)
}
.fmt0x64(uint64(), true)
}
.buf.writeByte('}')
} else {
.buf.writeByte('[')
for , := range {
if > 0 {
.buf.writeByte(' ')
}
.fmt.fmtInteger(uint64(), 10, unsigned, , ldigits)
}
.buf.writeByte(']')
}
case 's':
.fmt.fmtBs()
case 'x':
.fmt.fmtBx(, ldigits)
case 'X':
.fmt.fmtBx(, udigits)
case 'q':
.fmt.fmtQ(string())
default:
.printValue(reflect.ValueOf(), , 0)
}
}
func ( *pp) ( reflect.Value, rune) {
var uintptr
switch .Kind() {
case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
= .Pointer()
default:
.badVerb()
return
}
switch {
case 'v':
if .fmt.sharpV {
.buf.writeByte('(')
.buf.writeString(.Type().String())
.buf.writeString(")(")
if == 0 {
.buf.writeString(nilString)
} else {
.fmt0x64(uint64(), true)
}
.buf.writeByte(')')
} else {
if == 0 {
.fmt.padString(nilAngleString)
} else {
.fmt0x64(uint64(), !.fmt.sharp)
}
}
case 'p':
.fmt0x64(uint64(), !.fmt.sharp)
case 'b', 'o', 'd', 'x', 'X':
.fmtInteger(uint64(), unsigned, )
default:
.badVerb()
}
}
func ( *pp) ( interface{}, rune, string) {
if := recover(); != nil {
if := reflect.ValueOf(); .Kind() == reflect.Ptr && .IsNil() {
.buf.writeString(nilAngleString)
return
}
if .panicking {
panic()
}
:= .fmt.fmtFlags
.fmt.clearflags()
.buf.writeString(percentBangString)
.buf.writeRune()
.buf.writeString(panicString)
.buf.writeString()
.buf.writeString(" method: ")
.panicking = true
.printArg(, 'v')
.panicking = false
.buf.writeByte(')')
.fmt.fmtFlags =
}
}
func ( *pp) ( rune) ( bool) {
if .erroring {
return
}
if == 'w' {
, := .arg.(error)
if ! || !.wrapErrs || .wrappedErr != nil {
.wrappedErr = nil
.wrapErrs = false
.badVerb()
return true
}
.wrappedErr =
= 'v'
}
if , := .arg.(Formatter); {
= true
defer .catchPanic(.arg, , "Format")
.Format(, )
return
}
if .fmt.sharpV {
if , := .arg.(GoStringer); {
= true
defer .catchPanic(.arg, , "GoString")
.fmt.fmtS(.GoString())
return
}
} else {
switch {
case 'v', 's', 'x', 'X', 'q':
switch v := .arg.(type) {
case error:
= true
defer .catchPanic(.arg, , "Error")
.fmtString(.Error(), )
return
case Stringer:
= true
defer .catchPanic(.arg, , "String")
.fmtString(.String(), )
return
}
}
}
return false
}
func ( *pp) ( interface{}, rune) {
.arg =
.value = reflect.Value{}
if == nil {
switch {
case 'T', 'v':
.fmt.padString(nilAngleString)
default:
.badVerb()
}
return
}
switch {
case 'T':
.fmt.fmtS(reflect.TypeOf().String())
return
case 'p':
.fmtPointer(reflect.ValueOf(), 'p')
return
}
switch f := .(type) {
case bool:
.fmtBool(, )
case float32:
.fmtFloat(float64(), 32, )
case float64:
.fmtFloat(, 64, )
case complex64:
.fmtComplex(complex128(), 64, )
case complex128:
.fmtComplex(, 128, )
case int:
.fmtInteger(uint64(), signed, )
case int8:
.fmtInteger(uint64(), signed, )
case int16:
.fmtInteger(uint64(), signed, )
case int32:
.fmtInteger(uint64(), signed, )
case int64:
.fmtInteger(uint64(), signed, )
case uint:
.fmtInteger(uint64(), unsigned, )
case uint8:
.fmtInteger(uint64(), unsigned, )
case uint16:
.fmtInteger(uint64(), unsigned, )
case uint32:
.fmtInteger(uint64(), unsigned, )
case uint64:
.fmtInteger(, unsigned, )
case uintptr:
.fmtInteger(uint64(), unsigned, )
case string:
.fmtString(, )
case []byte:
.fmtBytes(, , "[]byte")
case reflect.Value:
if .IsValid() && .CanInterface() {
.arg = .Interface()
if .handleMethods() {
return
}
}
.printValue(, , 0)
default:
if !.handleMethods() {
.printValue(reflect.ValueOf(), , 0)
}
}
}
func ( *pp) ( reflect.Value, rune, int) {
if > 0 && .IsValid() && .CanInterface() {
.arg = .Interface()
if .handleMethods() {
return
}
}
.arg = nil
.value =
switch := ; .Kind() {
case reflect.Invalid:
if == 0 {
.buf.writeString(invReflectString)
} else {
switch {
case 'v':
.buf.writeString(nilAngleString)
default:
.badVerb()
}
}
case reflect.Bool:
.fmtBool(.Bool(), )
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
.fmtInteger(uint64(.Int()), signed, )
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
.fmtInteger(.Uint(), unsigned, )
case reflect.Float32:
.fmtFloat(.Float(), 32, )
case reflect.Float64:
.fmtFloat(.Float(), 64, )
case reflect.Complex64:
.fmtComplex(.Complex(), 64, )
case reflect.Complex128:
.fmtComplex(.Complex(), 128, )
case reflect.String:
.fmtString(.String(), )
case reflect.Map:
if .fmt.sharpV {
.buf.writeString(.Type().String())
if .IsNil() {
.buf.writeString(nilParenString)
return
}
.buf.writeByte('{')
} else {
.buf.writeString(mapString)
}
:= fmtsort.Sort()
for , := range .Key {
if > 0 {
if .fmt.sharpV {
.buf.writeString(commaSpaceString)
} else {
.buf.writeByte(' ')
}
}
.(, , +1)
.buf.writeByte(':')
.(.Value[], , +1)
}
if .fmt.sharpV {
.buf.writeByte('}')
} else {
.buf.writeByte(']')
}
case reflect.Struct:
if .fmt.sharpV {
.buf.writeString(.Type().String())
}
.buf.writeByte('{')
for := 0; < .NumField(); ++ {
if > 0 {
if .fmt.sharpV {
.buf.writeString(commaSpaceString)
} else {
.buf.writeByte(' ')
}
}
if .fmt.plusV || .fmt.sharpV {
if := .Type().Field().Name; != "" {
.buf.writeString()
.buf.writeByte(':')
}
}
.(getField(, ), , +1)
}
.buf.writeByte('}')
case reflect.Interface:
:= .Elem()
if !.IsValid() {
if .fmt.sharpV {
.buf.writeString(.Type().String())
.buf.writeString(nilParenString)
} else {
.buf.writeString(nilAngleString)
}
} else {
.(, , +1)
}
case reflect.Array, reflect.Slice:
switch {
case 's', 'q', 'x', 'X':
:= .Type()
if .Elem().Kind() == reflect.Uint8 {
var []byte
if .Kind() == reflect.Slice {
= .Bytes()
} else if .CanAddr() {
= .Slice(0, .Len()).Bytes()
} else {
= make([]byte, .Len())
for := range {
[] = byte(.Index().Uint())
}
}
.fmtBytes(, , .String())
return
}
}
if .fmt.sharpV {
.buf.writeString(.Type().String())
if .Kind() == reflect.Slice && .IsNil() {
.buf.writeString(nilParenString)
return
}
.buf.writeByte('{')
for := 0; < .Len(); ++ {
if > 0 {
.buf.writeString(commaSpaceString)
}
.(.Index(), , +1)
}
.buf.writeByte('}')
} else {
.buf.writeByte('[')
for := 0; < .Len(); ++ {
if > 0 {
.buf.writeByte(' ')
}
.(.Index(), , +1)
}
.buf.writeByte(']')
}
case reflect.Ptr:
if == 0 && .Pointer() != 0 {
switch := .Elem(); .Kind() {
case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:
.buf.writeByte('&')
.(, , +1)
return
}
}
fallthrough
case reflect.Chan, reflect.Func, reflect.UnsafePointer:
.fmtPointer(, )
default:
.unknownType()
}
}
func ( []interface{}, int) ( int, bool, int) {
=
if < len() {
, = [].(int)
if ! {
switch := reflect.ValueOf([]); .Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
:= .Int()
if int64(int()) == {
= int()
= true
}
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
:= .Uint()
if int64() >= 0 && uint64(int()) == {
= int()
= true
}
default:
}
}
= + 1
if tooLarge() {
= 0
= false
}
}
return
}
func ( string) ( int, int, bool) {
if len() < 3 {
return 0, 1, false
}
for := 1; < len(); ++ {
if [] == ']' {
, , := parsenum(, 1, )
if ! || != {
return 0, + 1, false
}
return - 1, + 1, true
}
}
return 0, 1, false
}
func ( *pp) ( int, string, int, int) (, int, bool) {
if len() <= || [] != '[' {
return , , false
}
.reordered = true
, , := parseArgNumber([:])
if && 0 <= && < {
return , + , true
}
.goodArgNum = false
return , + ,
}
func ( *pp) ( rune) {
.buf.writeString(percentBangString)
.buf.writeRune()
.buf.writeString(badIndexString)
}
func ( *pp) ( rune) {
.buf.writeString(percentBangString)
.buf.writeRune()
.buf.writeString(missingString)
}
func ( *pp) ( string, []interface{}) {
:= len()
:= 0
:= false
.reordered = false
:
for := 0; < ; {
.goodArgNum = true
:=
for < && [] != '%' {
++
}
if > {
.buf.writeString([:])
}
if >= {
break
}
++
.fmt.clearflags()
:
for ; < ; ++ {
:= []
switch {
case '#':
.fmt.sharp = true
case '0':
.fmt.zero = !.fmt.minus
case '+':
.fmt.plus = true
case '-':
.fmt.minus = true
.fmt.zero = false
case ' ':
.fmt.space = true
default:
if 'a' <= && <= 'z' && < len() {
if == 'v' {
.fmt.sharpV = .fmt.sharp
.fmt.sharp = false
.fmt.plusV = .fmt.plus
.fmt.plus = false
}
.printArg([], rune())
++
++
continue
}
break
}
}
, , = .argNumber(, , , len())
if < && [] == '*' {
++
.fmt.wid, .fmt.widPresent, = intFromArg(, )
if !.fmt.widPresent {
.buf.writeString(badWidthString)
}
if .fmt.wid < 0 {
.fmt.wid = -.fmt.wid
.fmt.minus = true
.fmt.zero = false
}
= false
} else {
.fmt.wid, .fmt.widPresent, = parsenum(, , )
if && .fmt.widPresent {
.goodArgNum = false
}
}
if +1 < && [] == '.' {
++
if {
.goodArgNum = false
}
, , = .argNumber(, , , len())
if < && [] == '*' {
++
.fmt.prec, .fmt.precPresent, = intFromArg(, )
if .fmt.prec < 0 {
.fmt.prec = 0
.fmt.precPresent = false
}
if !.fmt.precPresent {
.buf.writeString(badPrecString)
}
= false
} else {
.fmt.prec, .fmt.precPresent, = parsenum(, , )
if !.fmt.precPresent {
.fmt.prec = 0
.fmt.precPresent = true
}
}
}
if ! {
, , = .argNumber(, , , len())
}
if >= {
.buf.writeString(noVerbString)
break
}
, := rune([]), 1
if >= utf8.RuneSelf {
, = utf8.DecodeRuneInString([:])
}
+=
switch {
case == '%':
.buf.writeByte('%')
case !.goodArgNum:
.badArgNum()
case >= len():
.missingArg()
case == 'v':
.fmt.sharpV = .fmt.sharp
.fmt.sharp = false
.fmt.plusV = .fmt.plus
.fmt.plus = false
fallthrough
default:
.printArg([], )
++
}
}
if !.reordered && < len() {
.fmt.clearflags()
.buf.writeString(extraString)
for , := range [:] {
if > 0 {
.buf.writeString(commaSpaceString)
}
if == nil {
.buf.writeString(nilAngleString)
} else {
.buf.writeString(reflect.TypeOf().String())
.buf.writeByte('=')
.printArg(, 'v')
}
}
.buf.writeByte(')')
}
}
func ( *pp) ( []interface{}) {
:= false
for , := range {
:= != nil && reflect.TypeOf().Kind() == reflect.String
if > 0 && ! && ! {
.buf.writeByte(' ')
}
.printArg(, 'v')
=
}
}
func ( *pp) ( []interface{}) {
for , := range {
if > 0 {
.buf.writeByte(' ')
}
.printArg(, 'v')
}
.buf.writeByte('\n')
}