* gcc-interface/decl.c (warn_on_field_placement): Issue the warning
[official-gcc.git] / libgo / go / fmt / print.go
bloba7ef2e5ac210728da99aa51872744f81979d85cb
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.
5 package fmt
7 import (
8 "errors"
9 "io"
10 "os"
11 "reflect"
12 "sync"
13 "unicode/utf8"
16 // Strings for use with buffer.WriteString.
17 // This is less overhead than using buffer.Write with byte arrays.
18 const (
19 commaSpaceString = ", "
20 nilAngleString = "<nil>"
21 nilParenString = "(nil)"
22 nilString = "nil"
23 mapString = "map["
24 percentBangString = "%!"
25 missingString = "(MISSING)"
26 badIndexString = "(BADINDEX)"
27 panicString = "(PANIC="
28 extraString = "%!(EXTRA "
29 badWidthString = "%!(BADWIDTH)"
30 badPrecString = "%!(BADPREC)"
31 noVerbString = "%!(NOVERB)"
32 invReflectString = "<invalid reflect.Value>"
35 // State represents the printer state passed to custom formatters.
36 // It provides access to the io.Writer interface plus information about
37 // the flags and options for the operand's format specifier.
38 type State interface {
39 // Write is the function to call to emit formatted output to be printed.
40 Write(b []byte) (n int, err error)
41 // Width returns the value of the width option and whether it has been set.
42 Width() (wid int, ok bool)
43 // Precision returns the value of the precision option and whether it has been set.
44 Precision() (prec int, ok bool)
46 // Flag reports whether the flag c, a character, has been set.
47 Flag(c int) bool
50 // Formatter is the interface implemented by values with a custom formatter.
51 // The implementation of Format may call Sprint(f) or Fprint(f) etc.
52 // to generate its output.
53 type Formatter interface {
54 Format(f State, c rune)
57 // Stringer is implemented by any value that has a String method,
58 // which defines the ``native'' format for that value.
59 // The String method is used to print values passed as an operand
60 // to any format that accepts a string or to an unformatted printer
61 // such as Print.
62 type Stringer interface {
63 String() string
66 // GoStringer is implemented by any value that has a GoString method,
67 // which defines the Go syntax for that value.
68 // The GoString method is used to print values passed as an operand
69 // to a %#v format.
70 type GoStringer interface {
71 GoString() string
74 // Use simple []byte instead of bytes.Buffer to avoid large dependency.
75 type buffer []byte
77 func (b *buffer) Write(p []byte) {
78 *b = append(*b, p...)
81 func (b *buffer) WriteString(s string) {
82 *b = append(*b, s...)
85 func (b *buffer) WriteByte(c byte) {
86 *b = append(*b, c)
89 func (bp *buffer) WriteRune(r rune) {
90 if r < utf8.RuneSelf {
91 *bp = append(*bp, byte(r))
92 return
95 b := *bp
96 n := len(b)
97 for n+utf8.UTFMax > cap(b) {
98 b = append(b, 0)
100 w := utf8.EncodeRune(b[n:n+utf8.UTFMax], r)
101 *bp = b[:n+w]
104 // pp is used to store a printer's state and is reused with sync.Pool to avoid allocations.
105 type pp struct {
106 buf buffer
108 // arg holds the current item, as an interface{}.
109 arg interface{}
111 // value is used instead of arg for reflect values.
112 value reflect.Value
114 // fmt is used to format basic items such as integers or strings.
115 fmt fmt
117 // reordered records whether the format string used argument reordering.
118 reordered bool
119 // goodArgNum records whether the most recent reordering directive was valid.
120 goodArgNum bool
121 // panicking is set by catchPanic to avoid infinite panic, recover, panic, ... recursion.
122 panicking bool
123 // erroring is set when printing an error string to guard against calling handleMethods.
124 erroring bool
127 var ppFree = sync.Pool{
128 New: func() interface{} { return new(pp) },
131 // newPrinter allocates a new pp struct or grabs a cached one.
132 func newPrinter() *pp {
133 p := ppFree.Get().(*pp)
134 p.panicking = false
135 p.erroring = false
136 p.fmt.init(&p.buf)
137 return p
140 // free saves used pp structs in ppFree; avoids an allocation per invocation.
141 func (p *pp) free() {
142 p.buf = p.buf[:0]
143 p.arg = nil
144 p.value = reflect.Value{}
145 ppFree.Put(p)
148 func (p *pp) Width() (wid int, ok bool) { return p.fmt.wid, p.fmt.widPresent }
150 func (p *pp) Precision() (prec int, ok bool) { return p.fmt.prec, p.fmt.precPresent }
152 func (p *pp) Flag(b int) bool {
153 switch b {
154 case '-':
155 return p.fmt.minus
156 case '+':
157 return p.fmt.plus || p.fmt.plusV
158 case '#':
159 return p.fmt.sharp || p.fmt.sharpV
160 case ' ':
161 return p.fmt.space
162 case '0':
163 return p.fmt.zero
165 return false
168 // Implement Write so we can call Fprintf on a pp (through State), for
169 // recursive use in custom verbs.
170 func (p *pp) Write(b []byte) (ret int, err error) {
171 p.buf.Write(b)
172 return len(b), nil
175 // These routines end in 'f' and take a format string.
177 // Fprintf formats according to a format specifier and writes to w.
178 // It returns the number of bytes written and any write error encountered.
179 func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
180 p := newPrinter()
181 p.doPrintf(format, a)
182 n, err = w.Write(p.buf)
183 p.free()
184 return
187 // Printf formats according to a format specifier and writes to standard output.
188 // It returns the number of bytes written and any write error encountered.
189 func Printf(format string, a ...interface{}) (n int, err error) {
190 return Fprintf(os.Stdout, format, a...)
193 // Sprintf formats according to a format specifier and returns the resulting string.
194 func Sprintf(format string, a ...interface{}) string {
195 p := newPrinter()
196 p.doPrintf(format, a)
197 s := string(p.buf)
198 p.free()
199 return s
202 // Errorf formats according to a format specifier and returns the string
203 // as a value that satisfies error.
204 func Errorf(format string, a ...interface{}) error {
205 return errors.New(Sprintf(format, a...))
208 // These routines do not take a format string
210 // Fprint formats using the default formats for its operands and writes to w.
211 // Spaces are added between operands when neither is a string.
212 // It returns the number of bytes written and any write error encountered.
213 func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
214 p := newPrinter()
215 p.doPrint(a)
216 n, err = w.Write(p.buf)
217 p.free()
218 return
221 // Print formats using the default formats for its operands and writes to standard output.
222 // Spaces are added between operands when neither is a string.
223 // It returns the number of bytes written and any write error encountered.
224 func Print(a ...interface{}) (n int, err error) {
225 return Fprint(os.Stdout, a...)
228 // Sprint formats using the default formats for its operands and returns the resulting string.
229 // Spaces are added between operands when neither is a string.
230 func Sprint(a ...interface{}) string {
231 p := newPrinter()
232 p.doPrint(a)
233 s := string(p.buf)
234 p.free()
235 return s
238 // These routines end in 'ln', do not take a format string,
239 // always add spaces between operands, and add a newline
240 // after the last operand.
242 // Fprintln formats using the default formats for its operands and writes to w.
243 // Spaces are always added between operands and a newline is appended.
244 // It returns the number of bytes written and any write error encountered.
245 func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
246 p := newPrinter()
247 p.doPrintln(a)
248 n, err = w.Write(p.buf)
249 p.free()
250 return
253 // Println formats using the default formats for its operands and writes to standard output.
254 // Spaces are always added between operands and a newline is appended.
255 // It returns the number of bytes written and any write error encountered.
256 func Println(a ...interface{}) (n int, err error) {
257 return Fprintln(os.Stdout, a...)
260 // Sprintln formats using the default formats for its operands and returns the resulting string.
261 // Spaces are always added between operands and a newline is appended.
262 func Sprintln(a ...interface{}) string {
263 p := newPrinter()
264 p.doPrintln(a)
265 s := string(p.buf)
266 p.free()
267 return s
270 // getField gets the i'th field of the struct value.
271 // If the field is itself is an interface, return a value for
272 // the thing inside the interface, not the interface itself.
273 func getField(v reflect.Value, i int) reflect.Value {
274 val := v.Field(i)
275 if val.Kind() == reflect.Interface && !val.IsNil() {
276 val = val.Elem()
278 return val
281 // tooLarge reports whether the magnitude of the integer is
282 // too large to be used as a formatting width or precision.
283 func tooLarge(x int) bool {
284 const max int = 1e6
285 return x > max || x < -max
288 // parsenum converts ASCII to integer. num is 0 (and isnum is false) if no number present.
289 func parsenum(s string, start, end int) (num int, isnum bool, newi int) {
290 if start >= end {
291 return 0, false, end
293 for newi = start; newi < end && '0' <= s[newi] && s[newi] <= '9'; newi++ {
294 if tooLarge(num) {
295 return 0, false, end // Overflow; crazy long number most likely.
297 num = num*10 + int(s[newi]-'0')
298 isnum = true
300 return
303 func (p *pp) unknownType(v reflect.Value) {
304 if !v.IsValid() {
305 p.buf.WriteString(nilAngleString)
306 return
308 p.buf.WriteByte('?')
309 p.buf.WriteString(v.Type().String())
310 p.buf.WriteByte('?')
313 func (p *pp) badVerb(verb rune) {
314 p.erroring = true
315 p.buf.WriteString(percentBangString)
316 p.buf.WriteRune(verb)
317 p.buf.WriteByte('(')
318 switch {
319 case p.arg != nil:
320 p.buf.WriteString(reflect.TypeOf(p.arg).String())
321 p.buf.WriteByte('=')
322 p.printArg(p.arg, 'v')
323 case p.value.IsValid():
324 p.buf.WriteString(p.value.Type().String())
325 p.buf.WriteByte('=')
326 p.printValue(p.value, 'v', 0)
327 default:
328 p.buf.WriteString(nilAngleString)
330 p.buf.WriteByte(')')
331 p.erroring = false
334 func (p *pp) fmtBool(v bool, verb rune) {
335 switch verb {
336 case 't', 'v':
337 p.fmt.fmt_boolean(v)
338 default:
339 p.badVerb(verb)
343 // fmt0x64 formats a uint64 in hexadecimal and prefixes it with 0x or
344 // not, as requested, by temporarily setting the sharp flag.
345 func (p *pp) fmt0x64(v uint64, leading0x bool) {
346 sharp := p.fmt.sharp
347 p.fmt.sharp = leading0x
348 p.fmt.fmt_integer(v, 16, unsigned, ldigits)
349 p.fmt.sharp = sharp
352 // fmtInteger formats a signed or unsigned integer.
353 func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) {
354 switch verb {
355 case 'v':
356 if p.fmt.sharpV && !isSigned {
357 p.fmt0x64(v, true)
358 } else {
359 p.fmt.fmt_integer(v, 10, isSigned, ldigits)
361 case 'd':
362 p.fmt.fmt_integer(v, 10, isSigned, ldigits)
363 case 'b':
364 p.fmt.fmt_integer(v, 2, isSigned, ldigits)
365 case 'o':
366 p.fmt.fmt_integer(v, 8, isSigned, ldigits)
367 case 'x':
368 p.fmt.fmt_integer(v, 16, isSigned, ldigits)
369 case 'X':
370 p.fmt.fmt_integer(v, 16, isSigned, udigits)
371 case 'c':
372 p.fmt.fmt_c(v)
373 case 'q':
374 if v <= utf8.MaxRune {
375 p.fmt.fmt_qc(v)
376 } else {
377 p.badVerb(verb)
379 case 'U':
380 p.fmt.fmt_unicode(v)
381 default:
382 p.badVerb(verb)
386 // fmtFloat formats a float. The default precision for each verb
387 // is specified as last argument in the call to fmt_float.
388 func (p *pp) fmtFloat(v float64, size int, verb rune) {
389 switch verb {
390 case 'v':
391 p.fmt.fmt_float(v, size, 'g', -1)
392 case 'b', 'g', 'G':
393 p.fmt.fmt_float(v, size, verb, -1)
394 case 'f', 'e', 'E':
395 p.fmt.fmt_float(v, size, verb, 6)
396 case 'F':
397 p.fmt.fmt_float(v, size, 'f', 6)
398 default:
399 p.badVerb(verb)
403 // fmtComplex formats a complex number v with
404 // r = real(v) and j = imag(v) as (r+ji) using
405 // fmtFloat for r and j formatting.
406 func (p *pp) fmtComplex(v complex128, size int, verb rune) {
407 // Make sure any unsupported verbs are found before the
408 // calls to fmtFloat to not generate an incorrect error string.
409 switch verb {
410 case 'v', 'b', 'g', 'G', 'f', 'F', 'e', 'E':
411 oldPlus := p.fmt.plus
412 p.buf.WriteByte('(')
413 p.fmtFloat(real(v), size/2, verb)
414 // Imaginary part always has a sign.
415 p.fmt.plus = true
416 p.fmtFloat(imag(v), size/2, verb)
417 p.buf.WriteString("i)")
418 p.fmt.plus = oldPlus
419 default:
420 p.badVerb(verb)
424 func (p *pp) fmtString(v string, verb rune) {
425 switch verb {
426 case 'v':
427 if p.fmt.sharpV {
428 p.fmt.fmt_q(v)
429 } else {
430 p.fmt.fmt_s(v)
432 case 's':
433 p.fmt.fmt_s(v)
434 case 'x':
435 p.fmt.fmt_sx(v, ldigits)
436 case 'X':
437 p.fmt.fmt_sx(v, udigits)
438 case 'q':
439 p.fmt.fmt_q(v)
440 default:
441 p.badVerb(verb)
445 func (p *pp) fmtBytes(v []byte, verb rune, typeString string) {
446 switch verb {
447 case 'v', 'd':
448 if p.fmt.sharpV {
449 p.buf.WriteString(typeString)
450 if v == nil {
451 p.buf.WriteString(nilParenString)
452 return
454 p.buf.WriteByte('{')
455 for i, c := range v {
456 if i > 0 {
457 p.buf.WriteString(commaSpaceString)
459 p.fmt0x64(uint64(c), true)
461 p.buf.WriteByte('}')
462 } else {
463 p.buf.WriteByte('[')
464 for i, c := range v {
465 if i > 0 {
466 p.buf.WriteByte(' ')
468 p.fmt.fmt_integer(uint64(c), 10, unsigned, ldigits)
470 p.buf.WriteByte(']')
472 case 's':
473 p.fmt.fmt_s(string(v))
474 case 'x':
475 p.fmt.fmt_bx(v, ldigits)
476 case 'X':
477 p.fmt.fmt_bx(v, udigits)
478 case 'q':
479 p.fmt.fmt_q(string(v))
480 default:
481 p.printValue(reflect.ValueOf(v), verb, 0)
485 func (p *pp) fmtPointer(value reflect.Value, verb rune) {
486 var u uintptr
487 switch value.Kind() {
488 case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
489 u = value.Pointer()
490 default:
491 p.badVerb(verb)
492 return
495 switch verb {
496 case 'v':
497 if p.fmt.sharpV {
498 p.buf.WriteByte('(')
499 p.buf.WriteString(value.Type().String())
500 p.buf.WriteString(")(")
501 if u == 0 {
502 p.buf.WriteString(nilString)
503 } else {
504 p.fmt0x64(uint64(u), true)
506 p.buf.WriteByte(')')
507 } else {
508 if u == 0 {
509 p.fmt.padString(nilAngleString)
510 } else {
511 p.fmt0x64(uint64(u), !p.fmt.sharp)
514 case 'p':
515 p.fmt0x64(uint64(u), !p.fmt.sharp)
516 case 'b', 'o', 'd', 'x', 'X':
517 p.fmtInteger(uint64(u), unsigned, verb)
518 default:
519 p.badVerb(verb)
523 func (p *pp) catchPanic(arg interface{}, verb rune) {
524 if err := recover(); err != nil {
525 // If it's a nil pointer, just say "<nil>". The likeliest causes are a
526 // Stringer that fails to guard against nil or a nil pointer for a
527 // value receiver, and in either case, "<nil>" is a nice result.
528 if v := reflect.ValueOf(arg); v.Kind() == reflect.Ptr && v.IsNil() {
529 p.buf.WriteString(nilAngleString)
530 return
532 // Otherwise print a concise panic message. Most of the time the panic
533 // value will print itself nicely.
534 if p.panicking {
535 // Nested panics; the recursion in printArg cannot succeed.
536 panic(err)
539 oldFlags := p.fmt.fmtFlags
540 // For this output we want default behavior.
541 p.fmt.clearflags()
543 p.buf.WriteString(percentBangString)
544 p.buf.WriteRune(verb)
545 p.buf.WriteString(panicString)
546 p.panicking = true
547 p.printArg(err, 'v')
548 p.panicking = false
549 p.buf.WriteByte(')')
551 p.fmt.fmtFlags = oldFlags
555 func (p *pp) handleMethods(verb rune) (handled bool) {
556 if p.erroring {
557 return
559 // Is it a Formatter?
560 if formatter, ok := p.arg.(Formatter); ok {
561 handled = true
562 defer p.catchPanic(p.arg, verb)
563 formatter.Format(p, verb)
564 return
567 // If we're doing Go syntax and the argument knows how to supply it, take care of it now.
568 if p.fmt.sharpV {
569 if stringer, ok := p.arg.(GoStringer); ok {
570 handled = true
571 defer p.catchPanic(p.arg, verb)
572 // Print the result of GoString unadorned.
573 p.fmt.fmt_s(stringer.GoString())
574 return
576 } else {
577 // If a string is acceptable according to the format, see if
578 // the value satisfies one of the string-valued interfaces.
579 // Println etc. set verb to %v, which is "stringable".
580 switch verb {
581 case 'v', 's', 'x', 'X', 'q':
582 // Is it an error or Stringer?
583 // The duplication in the bodies is necessary:
584 // setting handled and deferring catchPanic
585 // must happen before calling the method.
586 switch v := p.arg.(type) {
587 case error:
588 handled = true
589 defer p.catchPanic(p.arg, verb)
590 p.fmtString(v.Error(), verb)
591 return
593 case Stringer:
594 handled = true
595 defer p.catchPanic(p.arg, verb)
596 p.fmtString(v.String(), verb)
597 return
601 return false
604 func (p *pp) printArg(arg interface{}, verb rune) {
605 p.arg = arg
606 p.value = reflect.Value{}
608 if arg == nil {
609 switch verb {
610 case 'T', 'v':
611 p.fmt.padString(nilAngleString)
612 default:
613 p.badVerb(verb)
615 return
618 // Special processing considerations.
619 // %T (the value's type) and %p (its address) are special; we always do them first.
620 switch verb {
621 case 'T':
622 p.fmt.fmt_s(reflect.TypeOf(arg).String())
623 return
624 case 'p':
625 p.fmtPointer(reflect.ValueOf(arg), 'p')
626 return
629 // Some types can be done without reflection.
630 switch f := arg.(type) {
631 case bool:
632 p.fmtBool(f, verb)
633 case float32:
634 p.fmtFloat(float64(f), 32, verb)
635 case float64:
636 p.fmtFloat(f, 64, verb)
637 case complex64:
638 p.fmtComplex(complex128(f), 64, verb)
639 case complex128:
640 p.fmtComplex(f, 128, verb)
641 case int:
642 p.fmtInteger(uint64(f), signed, verb)
643 case int8:
644 p.fmtInteger(uint64(f), signed, verb)
645 case int16:
646 p.fmtInteger(uint64(f), signed, verb)
647 case int32:
648 p.fmtInteger(uint64(f), signed, verb)
649 case int64:
650 p.fmtInteger(uint64(f), signed, verb)
651 case uint:
652 p.fmtInteger(uint64(f), unsigned, verb)
653 case uint8:
654 p.fmtInteger(uint64(f), unsigned, verb)
655 case uint16:
656 p.fmtInteger(uint64(f), unsigned, verb)
657 case uint32:
658 p.fmtInteger(uint64(f), unsigned, verb)
659 case uint64:
660 p.fmtInteger(f, unsigned, verb)
661 case uintptr:
662 p.fmtInteger(uint64(f), unsigned, verb)
663 case string:
664 p.fmtString(f, verb)
665 case []byte:
666 p.fmtBytes(f, verb, "[]byte")
667 case reflect.Value:
668 // Handle extractable values with special methods
669 // since printValue does not handle them at depth 0.
670 if f.IsValid() && f.CanInterface() {
671 p.arg = f.Interface()
672 if p.handleMethods(verb) {
673 return
676 p.printValue(f, verb, 0)
677 default:
678 // If the type is not simple, it might have methods.
679 if !p.handleMethods(verb) {
680 // Need to use reflection, since the type had no
681 // interface methods that could be used for formatting.
682 p.printValue(reflect.ValueOf(f), verb, 0)
687 var byteType = reflect.TypeOf(byte(0))
689 // printValue is similar to printArg but starts with a reflect value, not an interface{} value.
690 // It does not handle 'p' and 'T' verbs because these should have been already handled by printArg.
691 func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
692 // Handle values with special methods if not already handled by printArg (depth == 0).
693 if depth > 0 && value.IsValid() && value.CanInterface() {
694 p.arg = value.Interface()
695 if p.handleMethods(verb) {
696 return
699 p.arg = nil
700 p.value = value
702 switch f := value; value.Kind() {
703 case reflect.Invalid:
704 if depth == 0 {
705 p.buf.WriteString(invReflectString)
706 } else {
707 switch verb {
708 case 'v':
709 p.buf.WriteString(nilAngleString)
710 default:
711 p.badVerb(verb)
714 case reflect.Bool:
715 p.fmtBool(f.Bool(), verb)
716 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
717 p.fmtInteger(uint64(f.Int()), signed, verb)
718 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
719 p.fmtInteger(f.Uint(), unsigned, verb)
720 case reflect.Float32:
721 p.fmtFloat(f.Float(), 32, verb)
722 case reflect.Float64:
723 p.fmtFloat(f.Float(), 64, verb)
724 case reflect.Complex64:
725 p.fmtComplex(f.Complex(), 64, verb)
726 case reflect.Complex128:
727 p.fmtComplex(f.Complex(), 128, verb)
728 case reflect.String:
729 p.fmtString(f.String(), verb)
730 case reflect.Map:
731 if p.fmt.sharpV {
732 p.buf.WriteString(f.Type().String())
733 if f.IsNil() {
734 p.buf.WriteString(nilParenString)
735 return
737 p.buf.WriteByte('{')
738 } else {
739 p.buf.WriteString(mapString)
741 keys := f.MapKeys()
742 for i, key := range keys {
743 if i > 0 {
744 if p.fmt.sharpV {
745 p.buf.WriteString(commaSpaceString)
746 } else {
747 p.buf.WriteByte(' ')
750 p.printValue(key, verb, depth+1)
751 p.buf.WriteByte(':')
752 p.printValue(f.MapIndex(key), verb, depth+1)
754 if p.fmt.sharpV {
755 p.buf.WriteByte('}')
756 } else {
757 p.buf.WriteByte(']')
759 case reflect.Struct:
760 if p.fmt.sharpV {
761 p.buf.WriteString(f.Type().String())
763 p.buf.WriteByte('{')
764 for i := 0; i < f.NumField(); i++ {
765 if i > 0 {
766 if p.fmt.sharpV {
767 p.buf.WriteString(commaSpaceString)
768 } else {
769 p.buf.WriteByte(' ')
772 if p.fmt.plusV || p.fmt.sharpV {
773 if name := f.Type().Field(i).Name; name != "" {
774 p.buf.WriteString(name)
775 p.buf.WriteByte(':')
778 p.printValue(getField(f, i), verb, depth+1)
780 p.buf.WriteByte('}')
781 case reflect.Interface:
782 value := f.Elem()
783 if !value.IsValid() {
784 if p.fmt.sharpV {
785 p.buf.WriteString(f.Type().String())
786 p.buf.WriteString(nilParenString)
787 } else {
788 p.buf.WriteString(nilAngleString)
790 } else {
791 p.printValue(value, verb, depth+1)
793 case reflect.Array, reflect.Slice:
794 switch verb {
795 case 's', 'q', 'x', 'X':
796 // Handle byte and uint8 slices and arrays special for the above verbs.
797 t := f.Type()
798 if t.Elem().Kind() == reflect.Uint8 {
799 var bytes []byte
800 if f.Kind() == reflect.Slice {
801 bytes = f.Bytes()
802 } else if f.CanAddr() {
803 bytes = f.Slice(0, f.Len()).Bytes()
804 } else {
805 // We have an array, but we cannot Slice() a non-addressable array,
806 // so we build a slice by hand. This is a rare case but it would be nice
807 // if reflection could help a little more.
808 bytes = make([]byte, f.Len())
809 for i := range bytes {
810 bytes[i] = byte(f.Index(i).Uint())
813 p.fmtBytes(bytes, verb, t.String())
814 return
817 if p.fmt.sharpV {
818 p.buf.WriteString(f.Type().String())
819 if f.Kind() == reflect.Slice && f.IsNil() {
820 p.buf.WriteString(nilParenString)
821 return
823 p.buf.WriteByte('{')
824 for i := 0; i < f.Len(); i++ {
825 if i > 0 {
826 p.buf.WriteString(commaSpaceString)
828 p.printValue(f.Index(i), verb, depth+1)
830 p.buf.WriteByte('}')
831 } else {
832 p.buf.WriteByte('[')
833 for i := 0; i < f.Len(); i++ {
834 if i > 0 {
835 p.buf.WriteByte(' ')
837 p.printValue(f.Index(i), verb, depth+1)
839 p.buf.WriteByte(']')
841 case reflect.Ptr:
842 // pointer to array or slice or struct? ok at top level
843 // but not embedded (avoid loops)
844 if depth == 0 && f.Pointer() != 0 {
845 switch a := f.Elem(); a.Kind() {
846 case reflect.Array, reflect.Slice, reflect.Struct, reflect.Map:
847 p.buf.WriteByte('&')
848 p.printValue(a, verb, depth+1)
849 return
852 fallthrough
853 case reflect.Chan, reflect.Func, reflect.UnsafePointer:
854 p.fmtPointer(f, verb)
855 default:
856 p.unknownType(f)
860 // intFromArg gets the argNumth element of a. On return, isInt reports whether the argument has integer type.
861 func intFromArg(a []interface{}, argNum int) (num int, isInt bool, newArgNum int) {
862 newArgNum = argNum
863 if argNum < len(a) {
864 num, isInt = a[argNum].(int) // Almost always OK.
865 if !isInt {
866 // Work harder.
867 switch v := reflect.ValueOf(a[argNum]); v.Kind() {
868 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
869 n := v.Int()
870 if int64(int(n)) == n {
871 num = int(n)
872 isInt = true
874 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
875 n := v.Uint()
876 if int64(n) >= 0 && uint64(int(n)) == n {
877 num = int(n)
878 isInt = true
880 default:
881 // Already 0, false.
884 newArgNum = argNum + 1
885 if tooLarge(num) {
886 num = 0
887 isInt = false
890 return
893 // parseArgNumber returns the value of the bracketed number, minus 1
894 // (explicit argument numbers are one-indexed but we want zero-indexed).
895 // The opening bracket is known to be present at format[0].
896 // The returned values are the index, the number of bytes to consume
897 // up to the closing paren, if present, and whether the number parsed
898 // ok. The bytes to consume will be 1 if no closing paren is present.
899 func parseArgNumber(format string) (index int, wid int, ok bool) {
900 // There must be at least 3 bytes: [n].
901 if len(format) < 3 {
902 return 0, 1, false
905 // Find closing bracket.
906 for i := 1; i < len(format); i++ {
907 if format[i] == ']' {
908 width, ok, newi := parsenum(format, 1, i)
909 if !ok || newi != i {
910 return 0, i + 1, false
912 return width - 1, i + 1, true // arg numbers are one-indexed and skip paren.
915 return 0, 1, false
918 // argNumber returns the next argument to evaluate, which is either the value of the passed-in
919 // argNum or the value of the bracketed integer that begins format[i:]. It also returns
920 // the new value of i, that is, the index of the next byte of the format to process.
921 func (p *pp) argNumber(argNum int, format string, i int, numArgs int) (newArgNum, newi int, found bool) {
922 if len(format) <= i || format[i] != '[' {
923 return argNum, i, false
925 p.reordered = true
926 index, wid, ok := parseArgNumber(format[i:])
927 if ok && 0 <= index && index < numArgs {
928 return index, i + wid, true
930 p.goodArgNum = false
931 return argNum, i + wid, ok
934 func (p *pp) badArgNum(verb rune) {
935 p.buf.WriteString(percentBangString)
936 p.buf.WriteRune(verb)
937 p.buf.WriteString(badIndexString)
940 func (p *pp) missingArg(verb rune) {
941 p.buf.WriteString(percentBangString)
942 p.buf.WriteRune(verb)
943 p.buf.WriteString(missingString)
946 func (p *pp) doPrintf(format string, a []interface{}) {
947 end := len(format)
948 argNum := 0 // we process one argument per non-trivial format
949 afterIndex := false // previous item in format was an index like [3].
950 p.reordered = false
951 formatLoop:
952 for i := 0; i < end; {
953 p.goodArgNum = true
954 lasti := i
955 for i < end && format[i] != '%' {
958 if i > lasti {
959 p.buf.WriteString(format[lasti:i])
961 if i >= end {
962 // done processing format string
963 break
966 // Process one verb
969 // Do we have flags?
970 p.fmt.clearflags()
971 simpleFormat:
972 for ; i < end; i++ {
973 c := format[i]
974 switch c {
975 case '#':
976 p.fmt.sharp = true
977 case '0':
978 p.fmt.zero = !p.fmt.minus // Only allow zero padding to the left.
979 case '+':
980 p.fmt.plus = true
981 case '-':
982 p.fmt.minus = true
983 p.fmt.zero = false // Do not pad with zeros to the right.
984 case ' ':
985 p.fmt.space = true
986 default:
987 // Fast path for common case of ascii lower case simple verbs
988 // without precision or width or argument indices.
989 if 'a' <= c && c <= 'z' && argNum < len(a) {
990 if c == 'v' {
991 // Go syntax
992 p.fmt.sharpV = p.fmt.sharp
993 p.fmt.sharp = false
994 // Struct-field syntax
995 p.fmt.plusV = p.fmt.plus
996 p.fmt.plus = false
998 p.printArg(a[argNum], rune(c))
999 argNum++
1001 continue formatLoop
1003 // Format is more complex than simple flags and a verb or is malformed.
1004 break simpleFormat
1008 // Do we have an explicit argument index?
1009 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
1011 // Do we have width?
1012 if i < end && format[i] == '*' {
1014 p.fmt.wid, p.fmt.widPresent, argNum = intFromArg(a, argNum)
1016 if !p.fmt.widPresent {
1017 p.buf.WriteString(badWidthString)
1020 // We have a negative width, so take its value and ensure
1021 // that the minus flag is set
1022 if p.fmt.wid < 0 {
1023 p.fmt.wid = -p.fmt.wid
1024 p.fmt.minus = true
1025 p.fmt.zero = false // Do not pad with zeros to the right.
1027 afterIndex = false
1028 } else {
1029 p.fmt.wid, p.fmt.widPresent, i = parsenum(format, i, end)
1030 if afterIndex && p.fmt.widPresent { // "%[3]2d"
1031 p.goodArgNum = false
1035 // Do we have precision?
1036 if i+1 < end && format[i] == '.' {
1038 if afterIndex { // "%[3].2d"
1039 p.goodArgNum = false
1041 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
1042 if i < end && format[i] == '*' {
1044 p.fmt.prec, p.fmt.precPresent, argNum = intFromArg(a, argNum)
1045 // Negative precision arguments don't make sense
1046 if p.fmt.prec < 0 {
1047 p.fmt.prec = 0
1048 p.fmt.precPresent = false
1050 if !p.fmt.precPresent {
1051 p.buf.WriteString(badPrecString)
1053 afterIndex = false
1054 } else {
1055 p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i, end)
1056 if !p.fmt.precPresent {
1057 p.fmt.prec = 0
1058 p.fmt.precPresent = true
1063 if !afterIndex {
1064 argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
1067 if i >= end {
1068 p.buf.WriteString(noVerbString)
1069 break
1072 verb, w := utf8.DecodeRuneInString(format[i:])
1073 i += w
1075 switch {
1076 case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec.
1077 p.buf.WriteByte('%')
1078 case !p.goodArgNum:
1079 p.badArgNum(verb)
1080 case argNum >= len(a): // No argument left over to print for the current verb.
1081 p.missingArg(verb)
1082 case verb == 'v':
1083 // Go syntax
1084 p.fmt.sharpV = p.fmt.sharp
1085 p.fmt.sharp = false
1086 // Struct-field syntax
1087 p.fmt.plusV = p.fmt.plus
1088 p.fmt.plus = false
1089 fallthrough
1090 default:
1091 p.printArg(a[argNum], verb)
1092 argNum++
1096 // Check for extra arguments unless the call accessed the arguments
1097 // out of order, in which case it's too expensive to detect if they've all
1098 // been used and arguably OK if they're not.
1099 if !p.reordered && argNum < len(a) {
1100 p.fmt.clearflags()
1101 p.buf.WriteString(extraString)
1102 for i, arg := range a[argNum:] {
1103 if i > 0 {
1104 p.buf.WriteString(commaSpaceString)
1106 if arg == nil {
1107 p.buf.WriteString(nilAngleString)
1108 } else {
1109 p.buf.WriteString(reflect.TypeOf(arg).String())
1110 p.buf.WriteByte('=')
1111 p.printArg(arg, 'v')
1114 p.buf.WriteByte(')')
1118 func (p *pp) doPrint(a []interface{}) {
1119 prevString := false
1120 for argNum, arg := range a {
1121 isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String
1122 // Add a space between two non-string arguments.
1123 if argNum > 0 && !isString && !prevString {
1124 p.buf.WriteByte(' ')
1126 p.printArg(arg, 'v')
1127 prevString = isString
1131 // doPrintln is like doPrint but always adds a space between arguments
1132 // and a newline after the last argument.
1133 func (p *pp) doPrintln(a []interface{}) {
1134 for argNum, arg := range a {
1135 if argNum > 0 {
1136 p.buf.WriteByte(' ')
1138 p.printArg(arg, 'v')
1140 p.buf.WriteByte('\n')