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