1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package fmt 6 7import ( 8 "internal/fmtsort" 9 "io" 10 "os" 11 "reflect" 12 "strconv" 13 "sync" 14 "unicode/utf8" 15) 16 17// Strings for use with buffer.WriteString. 18// This is less overhead than using buffer.Write with byte arrays. 19const ( 20 commaSpaceString = ", " 21 nilAngleString = "<nil>" 22 nilParenString = "(nil)" 23 nilString = "nil" 24 mapString = "map[" 25 percentBangString = "%!" 26 missingString = "(MISSING)" 27 badIndexString = "(BADINDEX)" 28 panicString = "(PANIC=" 29 extraString = "%!(EXTRA " 30 badWidthString = "%!(BADWIDTH)" 31 badPrecString = "%!(BADPREC)" 32 noVerbString = "%!(NOVERB)" 33 invReflectString = "<invalid reflect.Value>" 34) 35 36// State represents the printer state passed to custom formatters. 37// It provides access to the [io.Writer] interface plus information about 38// the flags and options for the operand's format specifier. 39type State interface { 40 // Write is the function to call to emit formatted output to be printed. 41 Write(b []byte) (n int, err error) 42 // Width returns the value of the width option and whether it has been set. 43 Width() (wid int, ok bool) 44 // Precision returns the value of the precision option and whether it has been set. 45 Precision() (prec int, ok bool) 46 47 // Flag reports whether the flag c, a character, has been set. 48 Flag(c int) bool 49} 50 51// Formatter is implemented by any value that has a Format method. 52// The implementation controls how [State] and rune are interpreted, 53// and may call [Sprint] or [Fprint](f) etc. to generate its output. 54type Formatter interface { 55 Format(f State, verb rune) 56} 57 58// Stringer is implemented by any value that has a String method, 59// which defines the “native” format for that value. 60// The String method is used to print values passed as an operand 61// to any format that accepts a string or to an unformatted printer 62// such as [Print]. 63type Stringer interface { 64 String() string 65} 66 67// GoStringer is implemented by any value that has a GoString method, 68// which defines the Go syntax for that value. 69// The GoString method is used to print values passed as an operand 70// to a %#v format. 71type GoStringer interface { 72 GoString() string 73} 74 75// FormatString returns a string representing the fully qualified formatting 76// directive captured by the [State], followed by the argument verb. ([State] does not 77// itself contain the verb.) The result has a leading percent sign followed by any 78// flags, the width, and the precision. Missing flags, width, and precision are 79// omitted. This function allows a [Formatter] to reconstruct the original 80// directive triggering the call to Format. 81func FormatString(state State, verb rune) string { 82 var tmp [16]byte // Use a local buffer. 83 b := append(tmp[:0], '%') 84 for _, c := range " +-#0" { // All known flags 85 if state.Flag(int(c)) { // The argument is an int for historical reasons. 86 b = append(b, byte(c)) 87 } 88 } 89 if w, ok := state.Width(); ok { 90 b = strconv.AppendInt(b, int64(w), 10) 91 } 92 if p, ok := state.Precision(); ok { 93 b = append(b, '.') 94 b = strconv.AppendInt(b, int64(p), 10) 95 } 96 b = utf8.AppendRune(b, verb) 97 return string(b) 98} 99 100// Use simple []byte instead of bytes.Buffer to avoid large dependency. 101type buffer []byte 102 103func (b *buffer) write(p []byte) { 104 *b = append(*b, p...) 105} 106 107func (b *buffer) writeString(s string) { 108 *b = append(*b, s...) 109} 110 111func (b *buffer) writeByte(c byte) { 112 *b = append(*b, c) 113} 114 115func (b *buffer) writeRune(r rune) { 116 *b = utf8.AppendRune(*b, r) 117} 118 119// pp is used to store a printer's state and is reused with sync.Pool to avoid allocations. 120type pp struct { 121 buf buffer 122 123 // arg holds the current item, as an interface{}. 124 arg any 125 126 // value is used instead of arg for reflect values. 127 value reflect.Value 128 129 // fmt is used to format basic items such as integers or strings. 130 fmt fmt 131 132 // reordered records whether the format string used argument reordering. 133 reordered bool 134 // goodArgNum records whether the most recent reordering directive was valid. 135 goodArgNum bool 136 // panicking is set by catchPanic to avoid infinite panic, recover, panic, ... recursion. 137 panicking bool 138 // erroring is set when printing an error string to guard against calling handleMethods. 139 erroring bool 140 // wrapErrs is set when the format string may contain a %w verb. 141 wrapErrs bool 142 // wrappedErrs records the targets of the %w verb. 143 wrappedErrs []int 144} 145 146var ppFree = sync.Pool{ 147 New: func() any { return new(pp) }, 148} 149 150// newPrinter allocates a new pp struct or grabs a cached one. 151func newPrinter() *pp { 152 p := ppFree.Get().(*pp) 153 p.panicking = false 154 p.erroring = false 155 p.wrapErrs = false 156 p.fmt.init(&p.buf) 157 return p 158} 159 160// free saves used pp structs in ppFree; avoids an allocation per invocation. 161func (p *pp) free() { 162 // Proper usage of a sync.Pool requires each entry to have approximately 163 // the same memory cost. To obtain this property when the stored type 164 // contains a variably-sized buffer, we add a hard limit on the maximum 165 // buffer to place back in the pool. If the buffer is larger than the 166 // limit, we drop the buffer and recycle just the printer. 167 // 168 // See https://golang.org/issue/23199. 169 if cap(p.buf) > 64*1024 { 170 p.buf = nil 171 } else { 172 p.buf = p.buf[:0] 173 } 174 if cap(p.wrappedErrs) > 8 { 175 p.wrappedErrs = nil 176 } 177 178 p.arg = nil 179 p.value = reflect.Value{} 180 p.wrappedErrs = p.wrappedErrs[:0] 181 ppFree.Put(p) 182} 183 184func (p *pp) Width() (wid int, ok bool) { return p.fmt.wid, p.fmt.widPresent } 185 186func (p *pp) Precision() (prec int, ok bool) { return p.fmt.prec, p.fmt.precPresent } 187 188func (p *pp) Flag(b int) bool { 189 switch b { 190 case '-': 191 return p.fmt.minus 192 case '+': 193 return p.fmt.plus || p.fmt.plusV 194 case '#': 195 return p.fmt.sharp || p.fmt.sharpV 196 case ' ': 197 return p.fmt.space 198 case '0': 199 return p.fmt.zero 200 } 201 return false 202} 203 204// Implement Write so we can call [Fprintf] on a pp (through [State]), for 205// recursive use in custom verbs. 206func (p *pp) Write(b []byte) (ret int, err error) { 207 p.buf.write(b) 208 return len(b), nil 209} 210 211// Implement WriteString so that we can call [io.WriteString] 212// on a pp (through state), for efficiency. 213func (p *pp) WriteString(s string) (ret int, err error) { 214 p.buf.writeString(s) 215 return len(s), nil 216} 217 218// These routines end in 'f' and take a format string. 219 220// Fprintf formats according to a format specifier and writes to w. 221// It returns the number of bytes written and any write error encountered. 222func Fprintf(w io.Writer, format string, a ...any) (n int, err error) { 223 p := newPrinter() 224 p.doPrintf(format, a) 225 n, err = w.Write(p.buf) 226 p.free() 227 return 228} 229 230// Printf formats according to a format specifier and writes to standard output. 231// It returns the number of bytes written and any write error encountered. 232func Printf(format string, a ...any) (n int, err error) { 233 return Fprintf(os.Stdout, format, a...) 234} 235 236// Sprintf formats according to a format specifier and returns the resulting string. 237func Sprintf(format string, a ...any) string { 238 p := newPrinter() 239 p.doPrintf(format, a) 240 s := string(p.buf) 241 p.free() 242 return s 243} 244 245// Appendf formats according to a format specifier, appends the result to the byte 246// slice, and returns the updated slice. 247func Appendf(b []byte, format string, a ...any) []byte { 248 p := newPrinter() 249 p.doPrintf(format, a) 250 b = append(b, p.buf...) 251 p.free() 252 return b 253} 254 255// These routines do not take a format string 256 257// Fprint formats using the default formats for its operands and writes to w. 258// Spaces are added between operands when neither is a string. 259// It returns the number of bytes written and any write error encountered. 260func Fprint(w io.Writer, a ...any) (n int, err error) { 261 p := newPrinter() 262 p.doPrint(a) 263 n, err = w.Write(p.buf) 264 p.free() 265 return 266} 267 268// Print formats using the default formats for its operands and writes to standard output. 269// Spaces are added between operands when neither is a string. 270// It returns the number of bytes written and any write error encountered. 271func Print(a ...any) (n int, err error) { 272 return Fprint(os.Stdout, a...) 273} 274 275// Sprint formats using the default formats for its operands and returns the resulting string. 276// Spaces are added between operands when neither is a string. 277func Sprint(a ...any) string { 278 p := newPrinter() 279 p.doPrint(a) 280 s := string(p.buf) 281 p.free() 282 return s 283} 284 285// Append formats using the default formats for its operands, appends the result to 286// the byte slice, and returns the updated slice. 287func Append(b []byte, a ...any) []byte { 288 p := newPrinter() 289 p.doPrint(a) 290 b = append(b, p.buf...) 291 p.free() 292 return b 293} 294 295// These routines end in 'ln', do not take a format string, 296// always add spaces between operands, and add a newline 297// after the last operand. 298 299// Fprintln formats using the default formats for its operands and writes to w. 300// Spaces are always added between operands and a newline is appended. 301// It returns the number of bytes written and any write error encountered. 302func Fprintln(w io.Writer, a ...any) (n int, err error) { 303 p := newPrinter() 304 p.doPrintln(a) 305 n, err = w.Write(p.buf) 306 p.free() 307 return 308} 309 310// Println formats using the default formats for its operands and writes to standard output. 311// Spaces are always added between operands and a newline is appended. 312// It returns the number of bytes written and any write error encountered. 313func Println(a ...any) (n int, err error) { 314 return Fprintln(os.Stdout, a...) 315} 316 317// Sprintln formats using the default formats for its operands and returns the resulting string. 318// Spaces are always added between operands and a newline is appended. 319func Sprintln(a ...any) string { 320 p := newPrinter() 321 p.doPrintln(a) 322 s := string(p.buf) 323 p.free() 324 return s 325} 326 327// Appendln formats using the default formats for its operands, appends the result 328// to the byte slice, and returns the updated slice. Spaces are always added 329// between operands and a newline is appended. 330func Appendln(b []byte, a ...any) []byte { 331 p := newPrinter() 332 p.doPrintln(a) 333 b = append(b, p.buf...) 334 p.free() 335 return b 336} 337 338// getField gets the i'th field of the struct value. 339// If the field itself is a non-nil interface, return a value for 340// the thing inside the interface, not the interface itself. 341func getField(v reflect.Value, i int) reflect.Value { 342 val := v.Field(i) 343 if val.Kind() == reflect.Interface && !val.IsNil() { 344 val = val.Elem() 345 } 346 return val 347} 348 349// tooLarge reports whether the magnitude of the integer is 350// too large to be used as a formatting width or precision. 351func tooLarge(x int) bool { 352 const max int = 1e6 353 return x > max || x < -max 354} 355 356// parsenum converts ASCII to integer. num is 0 (and isnum is false) if no number present. 357func parsenum(s string, start, end int) (num int, isnum bool, newi int) { 358 if start >= end { 359 return 0, false, end 360 } 361 for newi = start; newi < end && '0' <= s[newi] && s[newi] <= '9'; newi++ { 362 if tooLarge(num) { 363 return 0, false, end // Overflow; crazy long number most likely. 364 } 365 num = num*10 + int(s[newi]-'0') 366 isnum = true 367 } 368 return 369} 370 371func (p *pp) unknownType(v reflect.Value) { 372 if !v.IsValid() { 373 p.buf.writeString(nilAngleString) 374 return 375 } 376 p.buf.writeByte('?') 377 p.buf.writeString(v.Type().String()) 378 p.buf.writeByte('?') 379} 380 381func (p *pp) badVerb(verb rune) { 382 p.erroring = true 383 p.buf.writeString(percentBangString) 384 p.buf.writeRune(verb) 385 p.buf.writeByte('(') 386 switch { 387 case p.arg != nil: 388 p.buf.writeString(reflect.TypeOf(p.arg).String()) 389 p.buf.writeByte('=') 390 p.printArg(p.arg, 'v') 391 case p.value.IsValid(): 392 p.buf.writeString(p.value.Type().String()) 393 p.buf.writeByte('=') 394 p.printValue(p.value, 'v', 0) 395 default: 396 p.buf.writeString(nilAngleString) 397 } 398 p.buf.writeByte(')') 399 p.erroring = false 400} 401 402func (p *pp) fmtBool(v bool, verb rune) { 403 switch verb { 404 case 't', 'v': 405 p.fmt.fmtBoolean(v) 406 default: 407 p.badVerb(verb) 408 } 409} 410 411// fmt0x64 formats a uint64 in hexadecimal and prefixes it with 0x or 412// not, as requested, by temporarily setting the sharp flag. 413func (p *pp) fmt0x64(v uint64, leading0x bool) { 414 sharp := p.fmt.sharp 415 p.fmt.sharp = leading0x 416 p.fmt.fmtInteger(v, 16, unsigned, 'v', ldigits) 417 p.fmt.sharp = sharp 418} 419 420// fmtInteger formats a signed or unsigned integer. 421func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) { 422 switch verb { 423 case 'v': 424 if p.fmt.sharpV && !isSigned { 425 p.fmt0x64(v, true) 426 } else { 427 p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits) 428 } 429 case 'd': 430 p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits) 431 case 'b': 432 p.fmt.fmtInteger(v, 2, isSigned, verb, ldigits) 433 case 'o', 'O': 434 p.fmt.fmtInteger(v, 8, isSigned, verb, ldigits) 435 case 'x': 436 p.fmt.fmtInteger(v, 16, isSigned, verb, ldigits) 437 case 'X': 438 p.fmt.fmtInteger(v, 16, isSigned, verb, udigits) 439 case 'c': 440 p.fmt.fmtC(v) 441 case 'q': 442 p.fmt.fmtQc(v) 443 case 'U': 444 p.fmt.fmtUnicode(v) 445 default: 446 p.badVerb(verb) 447 } 448} 449 450// fmtFloat formats a float. The default precision for each verb 451// is specified as last argument in the call to fmt_float. 452func (p *pp) fmtFloat(v float64, size int, verb rune) { 453 switch verb { 454 case 'v': 455 p.fmt.fmtFloat(v, size, 'g', -1) 456 case 'b', 'g', 'G', 'x', 'X': 457 p.fmt.fmtFloat(v, size, verb, -1) 458 case 'f', 'e', 'E': 459 p.fmt.fmtFloat(v, size, verb, 6) 460 case 'F': 461 p.fmt.fmtFloat(v, size, 'f', 6) 462 default: 463 p.badVerb(verb) 464 } 465} 466 467// fmtComplex formats a complex number v with 468// r = real(v) and j = imag(v) as (r+ji) using 469// fmtFloat for r and j formatting. 470func (p *pp) fmtComplex(v complex128, size int, verb rune) { 471 // Make sure any unsupported verbs are found before the 472 // calls to fmtFloat to not generate an incorrect error string. 473 switch verb { 474 case 'v', 'b', 'g', 'G', 'x', 'X', 'f', 'F', 'e', 'E': 475 oldPlus := p.fmt.plus 476 p.buf.writeByte('(') 477 p.fmtFloat(real(v), size/2, verb) 478 // Imaginary part always has a sign. 479 p.fmt.plus = true 480 p.fmtFloat(imag(v), size/2, verb) 481 p.buf.writeString("i)") 482 p.fmt.plus = oldPlus 483 default: 484 p.badVerb(verb) 485 } 486} 487 488func (p *pp) fmtString(v string, verb rune) { 489 switch verb { 490 case 'v': 491 if p.fmt.sharpV { 492 p.fmt.fmtQ(v) 493 } else { 494 p.fmt.fmtS(v) 495 } 496 case 's': 497 p.fmt.fmtS(v) 498 case 'x': 499 p.fmt.fmtSx(v, ldigits) 500 case 'X': 501 p.fmt.fmtSx(v, udigits) 502 case 'q': 503 p.fmt.fmtQ(v) 504 default: 505 p.badVerb(verb) 506 } 507} 508 509func (p *pp) fmtBytes(v []byte, verb rune, typeString string) { 510 switch verb { 511 case 'v', 'd': 512 if p.fmt.sharpV { 513 p.buf.writeString(typeString) 514 if v == nil { 515 p.buf.writeString(nilParenString) 516 return 517 } 518 p.buf.writeByte('{') 519 for i, c := range v { 520 if i > 0 { 521 p.buf.writeString(commaSpaceString) 522 } 523 p.fmt0x64(uint64(c), true) 524 } 525 p.buf.writeByte('}') 526 } else { 527 p.buf.writeByte('[') 528 for i, c := range v { 529 if i > 0 { 530 p.buf.writeByte(' ') 531 } 532 p.fmt.fmtInteger(uint64(c), 10, unsigned, verb, ldigits) 533 } 534 p.buf.writeByte(']') 535 } 536 case 's': 537 p.fmt.fmtBs(v) 538 case 'x': 539 p.fmt.fmtBx(v, ldigits) 540 case 'X': 541 p.fmt.fmtBx(v, udigits) 542 case 'q': 543 p.fmt.fmtQ(string(v)) 544 default: 545 p.printValue(reflect.ValueOf(v), verb, 0) 546 } 547} 548 549func (p *pp) fmtPointer(value reflect.Value, verb rune) { 550 var u uintptr 551 switch value.Kind() { 552 case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.Slice, reflect.UnsafePointer: 553 u = uintptr(value.UnsafePointer()) 554 default: 555 p.badVerb(verb) 556 return 557 } 558 559 switch verb { 560 case 'v': 561 if p.fmt.sharpV { 562 p.buf.writeByte('(') 563 p.buf.writeString(value.Type().String()) 564 p.buf.writeString(")(") 565 if u == 0 { 566 p.buf.writeString(nilString) 567 } else { 568 p.fmt0x64(uint64(u), true) 569 } 570 p.buf.writeByte(')') 571 } else { 572 if u == 0 { 573 p.fmt.padString(nilAngleString) 574 } else { 575 p.fmt0x64(uint64(u), !p.fmt.sharp) 576 } 577 } 578 case 'p': 579 p.fmt0x64(uint64(u), !p.fmt.sharp) 580 case 'b', 'o', 'd', 'x', 'X': 581 p.fmtInteger(uint64(u), unsigned, verb) 582 default: 583 p.badVerb(verb) 584 } 585} 586 587func (p *pp) catchPanic(arg any, verb rune, method string) { 588 if err := recover(); err != nil { 589 // If it's a nil pointer, just say "<nil>". The likeliest causes are a 590 // Stringer that fails to guard against nil or a nil pointer for a 591 // value receiver, and in either case, "<nil>" is a nice result. 592 if v := reflect.ValueOf(arg); v.Kind() == reflect.Pointer && v.IsNil() { 593 p.buf.writeString(nilAngleString) 594 return 595 } 596 // Otherwise print a concise panic message. Most of the time the panic 597 // value will print itself nicely. 598 if p.panicking { 599 // Nested panics; the recursion in printArg cannot succeed. 600 panic(err) 601 } 602 603 oldFlags := p.fmt.fmtFlags 604 // For this output we want default behavior. 605 p.fmt.clearflags() 606 607 p.buf.writeString(percentBangString) 608 p.buf.writeRune(verb) 609 p.buf.writeString(panicString) 610 p.buf.writeString(method) 611 p.buf.writeString(" method: ") 612 p.panicking = true 613 p.printArg(err, 'v') 614 p.panicking = false 615 p.buf.writeByte(')') 616 617 p.fmt.fmtFlags = oldFlags 618 } 619} 620 621func (p *pp) handleMethods(verb rune) (handled bool) { 622 if p.erroring { 623 return 624 } 625 if verb == 'w' { 626 // It is invalid to use %w other than with Errorf or with a non-error arg. 627 _, ok := p.arg.(error) 628 if !ok || !p.wrapErrs { 629 p.badVerb(verb) 630 return true 631 } 632 // If the arg is a Formatter, pass 'v' as the verb to it. 633 verb = 'v' 634 } 635 636 // Is it a Formatter? 637 if formatter, ok := p.arg.(Formatter); ok { 638 handled = true 639 defer p.catchPanic(p.arg, verb, "Format") 640 formatter.Format(p, verb) 641 return 642 } 643 644 // If we're doing Go syntax and the argument knows how to supply it, take care of it now. 645 if p.fmt.sharpV { 646 if stringer, ok := p.arg.(GoStringer); ok { 647 handled = true 648 defer p.catchPanic(p.arg, verb, "GoString") 649 // Print the result of GoString unadorned. 650 p.fmt.fmtS(stringer.GoString()) 651 return 652 } 653 } else { 654 // If a string is acceptable according to the format, see if 655 // the value satisfies one of the string-valued interfaces. 656 // Println etc. set verb to %v, which is "stringable". 657 switch verb { 658 case 'v', 's', 'x', 'X', 'q': 659 // Is it an error or Stringer? 660 // The duplication in the bodies is necessary: 661 // setting handled and deferring catchPanic 662 // must happen before calling the method. 663 switch v := p.arg.(type) { 664 case error: 665 handled = true 666 defer p.catchPanic(p.arg, verb, "Error") 667 p.fmtString(v.Error(), verb) 668 return 669 670 case Stringer: 671 handled = true 672 defer p.catchPanic(p.arg, verb, "String") 673 p.fmtString(v.String(), verb) 674 return 675 } 676 } 677 } 678 return false 679} 680 681func (p *pp) printArg(arg any, verb rune) { 682 p.arg = arg 683 p.value = reflect.Value{} 684 685 if arg == nil { 686 switch verb { 687 case 'T', 'v': 688 p.fmt.padString(nilAngleString) 689 default: 690 p.badVerb(verb) 691 } 692 return 693 } 694 695 // Special processing considerations. 696 // %T (the value's type) and %p (its address) are special; we always do them first. 697 switch verb { 698 case 'T': 699 p.fmt.fmtS(reflect.TypeOf(arg).String()) 700 return 701 case 'p': 702 p.fmtPointer(reflect.ValueOf(arg), 'p') 703 return 704 } 705 706 // Some types can be done without reflection. 707 switch f := arg.(type) { 708 case bool: 709 p.fmtBool(f, verb) 710 case float32: 711 p.fmtFloat(float64(f), 32, verb) 712 case float64: 713 p.fmtFloat(f, 64, verb) 714 case complex64: 715 p.fmtComplex(complex128(f), 64, verb) 716 case complex128: 717 p.fmtComplex(f, 128, verb) 718 case int: 719 p.fmtInteger(uint64(f), signed, verb) 720 case int8: 721 p.fmtInteger(uint64(f), signed, verb) 722 case int16: 723 p.fmtInteger(uint64(f), signed, verb) 724 case int32: 725 p.fmtInteger(uint64(f), signed, verb) 726 case int64: 727 p.fmtInteger(uint64(f), signed, verb) 728 case uint: 729 p.fmtInteger(uint64(f), unsigned, verb) 730 case uint8: 731 p.fmtInteger(uint64(f), unsigned, verb) 732 case uint16: 733 p.fmtInteger(uint64(f), unsigned, verb) 734 case uint32: 735 p.fmtInteger(uint64(f), unsigned, verb) 736 case uint64: 737 p.fmtInteger(f, unsigned, verb) 738 case uintptr: 739 p.fmtInteger(uint64(f), unsigned, verb) 740 case string: 741 p.fmtString(f, verb) 742 case []byte: 743 p.fmtBytes(f, verb, "[]byte") 744 case reflect.Value: 745 // Handle extractable values with special methods 746 // since printValue does not handle them at depth 0. 747 if f.IsValid() && f.CanInterface() { 748 p.arg = f.Interface() 749 if p.handleMethods(verb) { 750 return 751 } 752 } 753 p.printValue(f, verb, 0) 754 default: 755 // If the type is not simple, it might have methods. 756 if !p.handleMethods(verb) { 757 // Need to use reflection, since the type had no 758 // interface methods that could be used for formatting. 759 p.printValue(reflect.ValueOf(f), verb, 0) 760 } 761 } 762} 763 764// printValue is similar to printArg but starts with a reflect value, not an interface{} value. 765// It does not handle 'p' and 'T' verbs because these should have been already handled by printArg. 766func (p *pp) printValue(value reflect.Value, verb rune, depth int) { 767 // Handle values with special methods if not already handled by printArg (depth == 0). 768 if depth > 0 && value.IsValid() && value.CanInterface() { 769 p.arg = value.Interface() 770 if p.handleMethods(verb) { 771 return 772 } 773 } 774 p.arg = nil 775 p.value = value 776 777 switch f := value; value.Kind() { 778 case reflect.Invalid: 779 if depth == 0 { 780 p.buf.writeString(invReflectString) 781 } else { 782 switch verb { 783 case 'v': 784 p.buf.writeString(nilAngleString) 785 default: 786 p.badVerb(verb) 787 } 788 } 789 case reflect.Bool: 790 p.fmtBool(f.Bool(), verb) 791 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 792 p.fmtInteger(uint64(f.Int()), signed, verb) 793 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 794 p.fmtInteger(f.Uint(), unsigned, verb) 795 case reflect.Float32: 796 p.fmtFloat(f.Float(), 32, verb) 797 case reflect.Float64: 798 p.fmtFloat(f.Float(), 64, verb) 799 case reflect.Complex64: 800 p.fmtComplex(f.Complex(), 64, verb) 801 case reflect.Complex128: 802 p.fmtComplex(f.Complex(), 128, verb) 803 case reflect.String: 804 p.fmtString(f.String(), verb) 805 case reflect.Map: 806 if p.fmt.sharpV { 807 p.buf.writeString(f.Type().String()) 808 if f.IsNil() { 809 p.buf.writeString(nilParenString) 810 return 811 } 812 p.buf.writeByte('{') 813 } else { 814 p.buf.writeString(mapString) 815 } 816 sorted := fmtsort.Sort(f) 817 for i, m := range sorted { 818 if i > 0 { 819 if p.fmt.sharpV { 820 p.buf.writeString(commaSpaceString) 821 } else { 822 p.buf.writeByte(' ') 823 } 824 } 825 p.printValue(m.Key, verb, depth+1) 826 p.buf.writeByte(':') 827 p.printValue(m.Value, verb, depth+1) 828 } 829 if p.fmt.sharpV { 830 p.buf.writeByte('}') 831 } else { 832 p.buf.writeByte(']') 833 } 834 case reflect.Struct: 835 if p.fmt.sharpV { 836 p.buf.writeString(f.Type().String()) 837 } 838 p.buf.writeByte('{') 839 for i := 0; i < f.NumField(); i++ { 840 if i > 0 { 841 if p.fmt.sharpV { 842 p.buf.writeString(commaSpaceString) 843 } else { 844 p.buf.writeByte(' ') 845 } 846 } 847 if p.fmt.plusV || p.fmt.sharpV { 848 if name := f.Type().Field(i).Name; name != "" { 849 p.buf.writeString(name) 850 p.buf.writeByte(':') 851 } 852 } 853 p.printValue(getField(f, i), verb, depth+1) 854 } 855 p.buf.writeByte('}') 856 case reflect.Interface: 857 value := f.Elem() 858 if !value.IsValid() { 859 if p.fmt.sharpV { 860 p.buf.writeString(f.Type().String()) 861 p.buf.writeString(nilParenString) 862 } else { 863 p.buf.writeString(nilAngleString) 864 } 865 } else { 866 p.printValue(value, verb, depth+1) 867 } 868 case reflect.Array, reflect.Slice: 869 switch verb { 870 case 's', 'q', 'x', 'X': 871 // Handle byte and uint8 slices and arrays special for the above verbs. 872 t := f.Type() 873 if t.Elem().Kind() == reflect.Uint8 { 874 var bytes []byte 875 if f.Kind() == reflect.Slice || f.CanAddr() { 876 bytes = f.Bytes() 877 } else { 878 // We have an array, but we cannot Bytes() a non-addressable array, 879 // so we build a slice by hand. This is a rare case but it would be nice 880 // if reflection could help a little more. 881 bytes = make([]byte, f.Len()) 882 for i := range bytes { 883 bytes[i] = byte(f.Index(i).Uint()) 884 } 885 } 886 p.fmtBytes(bytes, verb, t.String()) 887 return 888 } 889 } 890 if p.fmt.sharpV { 891 p.buf.writeString(f.Type().String()) 892 if f.Kind() == reflect.Slice && f.IsNil() { 893 p.buf.writeString(nilParenString) 894 return 895 } 896 p.buf.writeByte('{') 897 for i := 0; i < f.Len(); i++ { 898 if i > 0 { 899 p.buf.writeString(commaSpaceString) 900 } 901 p.printValue(f.Index(i), verb, depth+1) 902 } 903 p.buf.writeByte('}') 904 } else { 905 p.buf.writeByte('[') 906 for i := 0; i < f.Len(); i++ { 907 if i > 0 { 908 p.buf.writeByte(' ') 909 } 910 p.printValue(f.Index(i), verb, depth+1) 911 } 912 p.buf.writeByte(']') 913 } 914 case reflect.Pointer: 915 // pointer to array or slice or struct? ok at top level 916 // but not embedded (avoid loops) 917 if depth == 0 && f.UnsafePointer() != nil { 918 switch a := f.Elem(); a.Kind() { 919 case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map: 920 p.buf.writeByte('&') 921 p.printValue(a, verb, depth+1) 922 return 923 } 924 } 925 fallthrough 926 case reflect.Chan, reflect.Func, reflect.UnsafePointer: 927 p.fmtPointer(f, verb) 928 default: 929 p.unknownType(f) 930 } 931} 932 933// intFromArg gets the argNumth element of a. On return, isInt reports whether the argument has integer type. 934func intFromArg(a []any, argNum int) (num int, isInt bool, newArgNum int) { 935 newArgNum = argNum 936 if argNum < len(a) { 937 num, isInt = a[argNum].(int) // Almost always OK. 938 if !isInt { 939 // Work harder. 940 switch v := reflect.ValueOf(a[argNum]); v.Kind() { 941 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 942 n := v.Int() 943 if int64(int(n)) == n { 944 num = int(n) 945 isInt = true 946 } 947 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 948 n := v.Uint() 949 if int64(n) >= 0 && uint64(int(n)) == n { 950 num = int(n) 951 isInt = true 952 } 953 default: 954 // Already 0, false. 955 } 956 } 957 newArgNum = argNum + 1 958 if tooLarge(num) { 959 num = 0 960 isInt = false 961 } 962 } 963 return 964} 965 966// parseArgNumber returns the value of the bracketed number, minus 1 967// (explicit argument numbers are one-indexed but we want zero-indexed). 968// The opening bracket is known to be present at format[0]. 969// The returned values are the index, the number of bytes to consume 970// up to the closing paren, if present, and whether the number parsed 971// ok. The bytes to consume will be 1 if no closing paren is present. 972func parseArgNumber(format string) (index int, wid int, ok bool) { 973 // There must be at least 3 bytes: [n]. 974 if len(format) < 3 { 975 return 0, 1, false 976 } 977 978 // Find closing bracket. 979 for i := 1; i < len(format); i++ { 980 if format[i] == ']' { 981 width, ok, newi := parsenum(format, 1, i) 982 if !ok || newi != i { 983 return 0, i + 1, false 984 } 985 return width - 1, i + 1, true // arg numbers are one-indexed and skip paren. 986 } 987 } 988 return 0, 1, false 989} 990 991// argNumber returns the next argument to evaluate, which is either the value of the passed-in 992// argNum or the value of the bracketed integer that begins format[i:]. It also returns 993// the new value of i, that is, the index of the next byte of the format to process. 994func (p *pp) argNumber(argNum int, format string, i int, numArgs int) (newArgNum, newi int, found bool) { 995 if len(format) <= i || format[i] != '[' { 996 return argNum, i, false 997 } 998 p.reordered = true 999 index, wid, ok := parseArgNumber(format[i:]) 1000 if ok && 0 <= index && index < numArgs { 1001 return index, i + wid, true 1002 } 1003 p.goodArgNum = false 1004 return argNum, i + wid, ok 1005} 1006 1007func (p *pp) badArgNum(verb rune) { 1008 p.buf.writeString(percentBangString) 1009 p.buf.writeRune(verb) 1010 p.buf.writeString(badIndexString) 1011} 1012 1013func (p *pp) missingArg(verb rune) { 1014 p.buf.writeString(percentBangString) 1015 p.buf.writeRune(verb) 1016 p.buf.writeString(missingString) 1017} 1018 1019func (p *pp) doPrintf(format string, a []any) { 1020 end := len(format) 1021 argNum := 0 // we process one argument per non-trivial format 1022 afterIndex := false // previous item in format was an index like [3]. 1023 p.reordered = false 1024formatLoop: 1025 for i := 0; i < end; { 1026 p.goodArgNum = true 1027 lasti := i 1028 for i < end && format[i] != '%' { 1029 i++ 1030 } 1031 if i > lasti { 1032 p.buf.writeString(format[lasti:i]) 1033 } 1034 if i >= end { 1035 // done processing format string 1036 break 1037 } 1038 1039 // Process one verb 1040 i++ 1041 1042 // Do we have flags? 1043 p.fmt.clearflags() 1044 simpleFormat: 1045 for ; i < end; i++ { 1046 c := format[i] 1047 switch c { 1048 case '#': 1049 p.fmt.sharp = true 1050 case '0': 1051 p.fmt.zero = true 1052 case '+': 1053 p.fmt.plus = true 1054 case '-': 1055 p.fmt.minus = true 1056 case ' ': 1057 p.fmt.space = true 1058 default: 1059 // Fast path for common case of ascii lower case simple verbs 1060 // without precision or width or argument indices. 1061 if 'a' <= c && c <= 'z' && argNum < len(a) { 1062 switch c { 1063 case 'w': 1064 p.wrappedErrs = append(p.wrappedErrs, argNum) 1065 fallthrough 1066 case 'v': 1067 // Go syntax 1068 p.fmt.sharpV = p.fmt.sharp 1069 p.fmt.sharp = false 1070 // Struct-field syntax 1071 p.fmt.plusV = p.fmt.plus 1072 p.fmt.plus = false 1073 } 1074 p.printArg(a[argNum], rune(c)) 1075 argNum++ 1076 i++ 1077 continue formatLoop 1078 } 1079 // Format is more complex than simple flags and a verb or is malformed. 1080 break simpleFormat 1081 } 1082 } 1083 1084 // Do we have an explicit argument index? 1085 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a)) 1086 1087 // Do we have width? 1088 if i < end && format[i] == '*' { 1089 i++ 1090 p.fmt.wid, p.fmt.widPresent, argNum = intFromArg(a, argNum) 1091 1092 if !p.fmt.widPresent { 1093 p.buf.writeString(badWidthString) 1094 } 1095 1096 // We have a negative width, so take its value and ensure 1097 // that the minus flag is set 1098 if p.fmt.wid < 0 { 1099 p.fmt.wid = -p.fmt.wid 1100 p.fmt.minus = true 1101 p.fmt.zero = false // Do not pad with zeros to the right. 1102 } 1103 afterIndex = false 1104 } else { 1105 p.fmt.wid, p.fmt.widPresent, i = parsenum(format, i, end) 1106 if afterIndex && p.fmt.widPresent { // "%[3]2d" 1107 p.goodArgNum = false 1108 } 1109 } 1110 1111 // Do we have precision? 1112 if i+1 < end && format[i] == '.' { 1113 i++ 1114 if afterIndex { // "%[3].2d" 1115 p.goodArgNum = false 1116 } 1117 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a)) 1118 if i < end && format[i] == '*' { 1119 i++ 1120 p.fmt.prec, p.fmt.precPresent, argNum = intFromArg(a, argNum) 1121 // Negative precision arguments don't make sense 1122 if p.fmt.prec < 0 { 1123 p.fmt.prec = 0 1124 p.fmt.precPresent = false 1125 } 1126 if !p.fmt.precPresent { 1127 p.buf.writeString(badPrecString) 1128 } 1129 afterIndex = false 1130 } else { 1131 p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i, end) 1132 if !p.fmt.precPresent { 1133 p.fmt.prec = 0 1134 p.fmt.precPresent = true 1135 } 1136 } 1137 } 1138 1139 if !afterIndex { 1140 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a)) 1141 } 1142 1143 if i >= end { 1144 p.buf.writeString(noVerbString) 1145 break 1146 } 1147 1148 verb, size := rune(format[i]), 1 1149 if verb >= utf8.RuneSelf { 1150 verb, size = utf8.DecodeRuneInString(format[i:]) 1151 } 1152 i += size 1153 1154 switch { 1155 case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec. 1156 p.buf.writeByte('%') 1157 case !p.goodArgNum: 1158 p.badArgNum(verb) 1159 case argNum >= len(a): // No argument left over to print for the current verb. 1160 p.missingArg(verb) 1161 case verb == 'w': 1162 p.wrappedErrs = append(p.wrappedErrs, argNum) 1163 fallthrough 1164 case verb == 'v': 1165 // Go syntax 1166 p.fmt.sharpV = p.fmt.sharp 1167 p.fmt.sharp = false 1168 // Struct-field syntax 1169 p.fmt.plusV = p.fmt.plus 1170 p.fmt.plus = false 1171 fallthrough 1172 default: 1173 p.printArg(a[argNum], verb) 1174 argNum++ 1175 } 1176 } 1177 1178 // Check for extra arguments unless the call accessed the arguments 1179 // out of order, in which case it's too expensive to detect if they've all 1180 // been used and arguably OK if they're not. 1181 if !p.reordered && argNum < len(a) { 1182 p.fmt.clearflags() 1183 p.buf.writeString(extraString) 1184 for i, arg := range a[argNum:] { 1185 if i > 0 { 1186 p.buf.writeString(commaSpaceString) 1187 } 1188 if arg == nil { 1189 p.buf.writeString(nilAngleString) 1190 } else { 1191 p.buf.writeString(reflect.TypeOf(arg).String()) 1192 p.buf.writeByte('=') 1193 p.printArg(arg, 'v') 1194 } 1195 } 1196 p.buf.writeByte(')') 1197 } 1198} 1199 1200func (p *pp) doPrint(a []any) { 1201 prevString := false 1202 for argNum, arg := range a { 1203 isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String 1204 // Add a space between two non-string arguments. 1205 if argNum > 0 && !isString && !prevString { 1206 p.buf.writeByte(' ') 1207 } 1208 p.printArg(arg, 'v') 1209 prevString = isString 1210 } 1211} 1212 1213// doPrintln is like doPrint but always adds a space between arguments 1214// and a newline after the last argument. 1215func (p *pp) doPrintln(a []any) { 1216 for argNum, arg := range a { 1217 if argNum > 0 { 1218 p.buf.writeByte(' ') 1219 } 1220 p.printArg(arg, 'v') 1221 } 1222 p.buf.writeByte('\n') 1223} 1224