Home | History | Annotate | Download | only in fmt
      1 // Copyright 2010 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 	"math"
     11 	"os"
     12 	"reflect"
     13 	"strconv"
     14 	"sync"
     15 	"unicode/utf8"
     16 )
     17 
     18 // ScanState represents the scanner state passed to custom scanners.
     19 // Scanners may do rune-at-a-time scanning or ask the ScanState
     20 // to discover the next space-delimited token.
     21 type ScanState interface {
     22 	// ReadRune reads the next rune (Unicode code point) from the input.
     23 	// If invoked during Scanln, Fscanln, or Sscanln, ReadRune() will
     24 	// return EOF after returning the first '\n' or when reading beyond
     25 	// the specified width.
     26 	ReadRune() (r rune, size int, err error)
     27 	// UnreadRune causes the next call to ReadRune to return the same rune.
     28 	UnreadRune() error
     29 	// SkipSpace skips space in the input. Newlines are treated appropriately
     30 	// for the operation being performed; see the package documentation
     31 	// for more information.
     32 	SkipSpace()
     33 	// Token skips space in the input if skipSpace is true, then returns the
     34 	// run of Unicode code points c satisfying f(c).  If f is nil,
     35 	// !unicode.IsSpace(c) is used; that is, the token will hold non-space
     36 	// characters. Newlines are treated appropriately for the operation being
     37 	// performed; see the package documentation for more information.
     38 	// The returned slice points to shared data that may be overwritten
     39 	// by the next call to Token, a call to a Scan function using the ScanState
     40 	// as input, or when the calling Scan method returns.
     41 	Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
     42 	// Width returns the value of the width option and whether it has been set.
     43 	// The unit is Unicode code points.
     44 	Width() (wid int, ok bool)
     45 	// Because ReadRune is implemented by the interface, Read should never be
     46 	// called by the scanning routines and a valid implementation of
     47 	// ScanState may choose always to return an error from Read.
     48 	Read(buf []byte) (n int, err error)
     49 }
     50 
     51 // Scanner is implemented by any value that has a Scan method, which scans
     52 // the input for the representation of a value and stores the result in the
     53 // receiver, which must be a pointer to be useful. The Scan method is called
     54 // for any argument to Scan, Scanf, or Scanln that implements it.
     55 type Scanner interface {
     56 	Scan(state ScanState, verb rune) error
     57 }
     58 
     59 // Scan scans text read from standard input, storing successive
     60 // space-separated values into successive arguments. Newlines count
     61 // as space. It returns the number of items successfully scanned.
     62 // If that is less than the number of arguments, err will report why.
     63 func Scan(a ...interface{}) (n int, err error) {
     64 	return Fscan(os.Stdin, a...)
     65 }
     66 
     67 // Scanln is similar to Scan, but stops scanning at a newline and
     68 // after the final item there must be a newline or EOF.
     69 func Scanln(a ...interface{}) (n int, err error) {
     70 	return Fscanln(os.Stdin, a...)
     71 }
     72 
     73 // Scanf scans text read from standard input, storing successive
     74 // space-separated values into successive arguments as determined by
     75 // the format. It returns the number of items successfully scanned.
     76 // If that is less than the number of arguments, err will report why.
     77 // Newlines in the input must match newlines in the format.
     78 // The one exception: the verb %c always scans the next rune in the
     79 // input, even if it is a space (or tab etc.) or newline.
     80 func Scanf(format string, a ...interface{}) (n int, err error) {
     81 	return Fscanf(os.Stdin, format, a...)
     82 }
     83 
     84 type stringReader string
     85 
     86 func (r *stringReader) Read(b []byte) (n int, err error) {
     87 	n = copy(b, *r)
     88 	*r = (*r)[n:]
     89 	if n == 0 {
     90 		err = io.EOF
     91 	}
     92 	return
     93 }
     94 
     95 // Sscan scans the argument string, storing successive space-separated
     96 // values into successive arguments. Newlines count as space. It
     97 // returns the number of items successfully scanned. If that is less
     98 // than the number of arguments, err will report why.
     99 func Sscan(str string, a ...interface{}) (n int, err error) {
    100 	return Fscan((*stringReader)(&str), a...)
    101 }
    102 
    103 // Sscanln is similar to Sscan, but stops scanning at a newline and
    104 // after the final item there must be a newline or EOF.
    105 func Sscanln(str string, a ...interface{}) (n int, err error) {
    106 	return Fscanln((*stringReader)(&str), a...)
    107 }
    108 
    109 // Sscanf scans the argument string, storing successive space-separated
    110 // values into successive arguments as determined by the format. It
    111 // returns the number of items successfully parsed.
    112 // Newlines in the input must match newlines in the format.
    113 func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
    114 	return Fscanf((*stringReader)(&str), format, a...)
    115 }
    116 
    117 // Fscan scans text read from r, storing successive space-separated
    118 // values into successive arguments. Newlines count as space. It
    119 // returns the number of items successfully scanned. If that is less
    120 // than the number of arguments, err will report why.
    121 func Fscan(r io.Reader, a ...interface{}) (n int, err error) {
    122 	s, old := newScanState(r, true, false)
    123 	n, err = s.doScan(a)
    124 	s.free(old)
    125 	return
    126 }
    127 
    128 // Fscanln is similar to Fscan, but stops scanning at a newline and
    129 // after the final item there must be a newline or EOF.
    130 func Fscanln(r io.Reader, a ...interface{}) (n int, err error) {
    131 	s, old := newScanState(r, false, true)
    132 	n, err = s.doScan(a)
    133 	s.free(old)
    134 	return
    135 }
    136 
    137 // Fscanf scans text read from r, storing successive space-separated
    138 // values into successive arguments as determined by the format. It
    139 // returns the number of items successfully parsed.
    140 // Newlines in the input must match newlines in the format.
    141 func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) {
    142 	s, old := newScanState(r, false, false)
    143 	n, err = s.doScanf(format, a)
    144 	s.free(old)
    145 	return
    146 }
    147 
    148 // scanError represents an error generated by the scanning software.
    149 // It's used as a unique signature to identify such errors when recovering.
    150 type scanError struct {
    151 	err error
    152 }
    153 
    154 const eof = -1
    155 
    156 // ss is the internal implementation of ScanState.
    157 type ss struct {
    158 	rs    io.RuneScanner // where to read input
    159 	buf   buffer         // token accumulator
    160 	count int            // runes consumed so far.
    161 	atEOF bool           // already read EOF
    162 	ssave
    163 }
    164 
    165 // ssave holds the parts of ss that need to be
    166 // saved and restored on recursive scans.
    167 type ssave struct {
    168 	validSave bool // is or was a part of an actual ss.
    169 	nlIsEnd   bool // whether newline terminates scan
    170 	nlIsSpace bool // whether newline counts as white space
    171 	argLimit  int  // max value of ss.count for this arg; argLimit <= limit
    172 	limit     int  // max value of ss.count.
    173 	maxWid    int  // width of this arg.
    174 }
    175 
    176 // The Read method is only in ScanState so that ScanState
    177 // satisfies io.Reader. It will never be called when used as
    178 // intended, so there is no need to make it actually work.
    179 func (s *ss) Read(buf []byte) (n int, err error) {
    180 	return 0, errors.New("ScanState's Read should not be called. Use ReadRune")
    181 }
    182 
    183 func (s *ss) ReadRune() (r rune, size int, err error) {
    184 	if s.atEOF || s.count >= s.argLimit {
    185 		err = io.EOF
    186 		return
    187 	}
    188 
    189 	r, size, err = s.rs.ReadRune()
    190 	if err == nil {
    191 		s.count++
    192 		if s.nlIsEnd && r == '\n' {
    193 			s.atEOF = true
    194 		}
    195 	} else if err == io.EOF {
    196 		s.atEOF = true
    197 	}
    198 	return
    199 }
    200 
    201 func (s *ss) Width() (wid int, ok bool) {
    202 	if s.maxWid == hugeWid {
    203 		return 0, false
    204 	}
    205 	return s.maxWid, true
    206 }
    207 
    208 // The public method returns an error; this private one panics.
    209 // If getRune reaches EOF, the return value is EOF (-1).
    210 func (s *ss) getRune() (r rune) {
    211 	r, _, err := s.ReadRune()
    212 	if err != nil {
    213 		if err == io.EOF {
    214 			return eof
    215 		}
    216 		s.error(err)
    217 	}
    218 	return
    219 }
    220 
    221 // mustReadRune turns io.EOF into a panic(io.ErrUnexpectedEOF).
    222 // It is called in cases such as string scanning where an EOF is a
    223 // syntax error.
    224 func (s *ss) mustReadRune() (r rune) {
    225 	r = s.getRune()
    226 	if r == eof {
    227 		s.error(io.ErrUnexpectedEOF)
    228 	}
    229 	return
    230 }
    231 
    232 func (s *ss) UnreadRune() error {
    233 	s.rs.UnreadRune()
    234 	s.atEOF = false
    235 	s.count--
    236 	return nil
    237 }
    238 
    239 func (s *ss) error(err error) {
    240 	panic(scanError{err})
    241 }
    242 
    243 func (s *ss) errorString(err string) {
    244 	panic(scanError{errors.New(err)})
    245 }
    246 
    247 func (s *ss) Token(skipSpace bool, f func(rune) bool) (tok []byte, err error) {
    248 	defer func() {
    249 		if e := recover(); e != nil {
    250 			if se, ok := e.(scanError); ok {
    251 				err = se.err
    252 			} else {
    253 				panic(e)
    254 			}
    255 		}
    256 	}()
    257 	if f == nil {
    258 		f = notSpace
    259 	}
    260 	s.buf = s.buf[:0]
    261 	tok = s.token(skipSpace, f)
    262 	return
    263 }
    264 
    265 // space is a copy of the unicode.White_Space ranges,
    266 // to avoid depending on package unicode.
    267 var space = [][2]uint16{
    268 	{0x0009, 0x000d},
    269 	{0x0020, 0x0020},
    270 	{0x0085, 0x0085},
    271 	{0x00a0, 0x00a0},
    272 	{0x1680, 0x1680},
    273 	{0x2000, 0x200a},
    274 	{0x2028, 0x2029},
    275 	{0x202f, 0x202f},
    276 	{0x205f, 0x205f},
    277 	{0x3000, 0x3000},
    278 }
    279 
    280 func isSpace(r rune) bool {
    281 	if r >= 1<<16 {
    282 		return false
    283 	}
    284 	rx := uint16(r)
    285 	for _, rng := range space {
    286 		if rx < rng[0] {
    287 			return false
    288 		}
    289 		if rx <= rng[1] {
    290 			return true
    291 		}
    292 	}
    293 	return false
    294 }
    295 
    296 // notSpace is the default scanning function used in Token.
    297 func notSpace(r rune) bool {
    298 	return !isSpace(r)
    299 }
    300 
    301 // readRune is a structure to enable reading UTF-8 encoded code points
    302 // from an io.Reader. It is used if the Reader given to the scanner does
    303 // not already implement io.RuneScanner.
    304 type readRune struct {
    305 	reader   io.Reader
    306 	buf      [utf8.UTFMax]byte // used only inside ReadRune
    307 	pending  int               // number of bytes in pendBuf; only >0 for bad UTF-8
    308 	pendBuf  [utf8.UTFMax]byte // bytes left over
    309 	peekRune rune              // if >=0 next rune; when <0 is ^(previous Rune)
    310 }
    311 
    312 // readByte returns the next byte from the input, which may be
    313 // left over from a previous read if the UTF-8 was ill-formed.
    314 func (r *readRune) readByte() (b byte, err error) {
    315 	if r.pending > 0 {
    316 		b = r.pendBuf[0]
    317 		copy(r.pendBuf[0:], r.pendBuf[1:])
    318 		r.pending--
    319 		return
    320 	}
    321 	n, err := io.ReadFull(r.reader, r.pendBuf[:1])
    322 	if n != 1 {
    323 		return 0, err
    324 	}
    325 	return r.pendBuf[0], err
    326 }
    327 
    328 // ReadRune returns the next UTF-8 encoded code point from the
    329 // io.Reader inside r.
    330 func (r *readRune) ReadRune() (rr rune, size int, err error) {
    331 	if r.peekRune >= 0 {
    332 		rr = r.peekRune
    333 		r.peekRune = ^r.peekRune
    334 		size = utf8.RuneLen(rr)
    335 		return
    336 	}
    337 	r.buf[0], err = r.readByte()
    338 	if err != nil {
    339 		return
    340 	}
    341 	if r.buf[0] < utf8.RuneSelf { // fast check for common ASCII case
    342 		rr = rune(r.buf[0])
    343 		size = 1 // Known to be 1.
    344 		// Flip the bits of the rune so it's available to UnreadRune.
    345 		r.peekRune = ^rr
    346 		return
    347 	}
    348 	var n int
    349 	for n = 1; !utf8.FullRune(r.buf[:n]); n++ {
    350 		r.buf[n], err = r.readByte()
    351 		if err != nil {
    352 			if err == io.EOF {
    353 				err = nil
    354 				break
    355 			}
    356 			return
    357 		}
    358 	}
    359 	rr, size = utf8.DecodeRune(r.buf[:n])
    360 	if size < n { // an error, save the bytes for the next read
    361 		copy(r.pendBuf[r.pending:], r.buf[size:n])
    362 		r.pending += n - size
    363 	}
    364 	// Flip the bits of the rune so it's available to UnreadRune.
    365 	r.peekRune = ^rr
    366 	return
    367 }
    368 
    369 func (r *readRune) UnreadRune() error {
    370 	if r.peekRune >= 0 {
    371 		return errors.New("fmt: scanning called UnreadRune with no rune available")
    372 	}
    373 	// Reverse bit flip of previously read rune to obtain valid >=0 state.
    374 	r.peekRune = ^r.peekRune
    375 	return nil
    376 }
    377 
    378 var ssFree = sync.Pool{
    379 	New: func() interface{} { return new(ss) },
    380 }
    381 
    382 // newScanState allocates a new ss struct or grab a cached one.
    383 func newScanState(r io.Reader, nlIsSpace, nlIsEnd bool) (s *ss, old ssave) {
    384 	s = ssFree.Get().(*ss)
    385 	if rs, ok := r.(io.RuneScanner); ok {
    386 		s.rs = rs
    387 	} else {
    388 		s.rs = &readRune{reader: r, peekRune: -1}
    389 	}
    390 	s.nlIsSpace = nlIsSpace
    391 	s.nlIsEnd = nlIsEnd
    392 	s.atEOF = false
    393 	s.limit = hugeWid
    394 	s.argLimit = hugeWid
    395 	s.maxWid = hugeWid
    396 	s.validSave = true
    397 	s.count = 0
    398 	return
    399 }
    400 
    401 // free saves used ss structs in ssFree; avoid an allocation per invocation.
    402 func (s *ss) free(old ssave) {
    403 	// If it was used recursively, just restore the old state.
    404 	if old.validSave {
    405 		s.ssave = old
    406 		return
    407 	}
    408 	// Don't hold on to ss structs with large buffers.
    409 	if cap(s.buf) > 1024 {
    410 		return
    411 	}
    412 	s.buf = s.buf[:0]
    413 	s.rs = nil
    414 	ssFree.Put(s)
    415 }
    416 
    417 // SkipSpace provides Scan methods the ability to skip space and newline
    418 // characters in keeping with the current scanning mode set by format strings
    419 // and Scan/Scanln.
    420 func (s *ss) SkipSpace() {
    421 	for {
    422 		r := s.getRune()
    423 		if r == eof {
    424 			return
    425 		}
    426 		if r == '\r' && s.peek("\n") {
    427 			continue
    428 		}
    429 		if r == '\n' {
    430 			if s.nlIsSpace {
    431 				continue
    432 			}
    433 			s.errorString("unexpected newline")
    434 			return
    435 		}
    436 		if !isSpace(r) {
    437 			s.UnreadRune()
    438 			break
    439 		}
    440 	}
    441 }
    442 
    443 // token returns the next space-delimited string from the input. It
    444 // skips white space. For Scanln, it stops at newlines. For Scan,
    445 // newlines are treated as spaces.
    446 func (s *ss) token(skipSpace bool, f func(rune) bool) []byte {
    447 	if skipSpace {
    448 		s.SkipSpace()
    449 	}
    450 	// read until white space or newline
    451 	for {
    452 		r := s.getRune()
    453 		if r == eof {
    454 			break
    455 		}
    456 		if !f(r) {
    457 			s.UnreadRune()
    458 			break
    459 		}
    460 		s.buf.WriteRune(r)
    461 	}
    462 	return s.buf
    463 }
    464 
    465 var complexError = errors.New("syntax error scanning complex number")
    466 var boolError = errors.New("syntax error scanning boolean")
    467 
    468 func indexRune(s string, r rune) int {
    469 	for i, c := range s {
    470 		if c == r {
    471 			return i
    472 		}
    473 	}
    474 	return -1
    475 }
    476 
    477 // consume reads the next rune in the input and reports whether it is in the ok string.
    478 // If accept is true, it puts the character into the input token.
    479 func (s *ss) consume(ok string, accept bool) bool {
    480 	r := s.getRune()
    481 	if r == eof {
    482 		return false
    483 	}
    484 	if indexRune(ok, r) >= 0 {
    485 		if accept {
    486 			s.buf.WriteRune(r)
    487 		}
    488 		return true
    489 	}
    490 	if r != eof && accept {
    491 		s.UnreadRune()
    492 	}
    493 	return false
    494 }
    495 
    496 // peek reports whether the next character is in the ok string, without consuming it.
    497 func (s *ss) peek(ok string) bool {
    498 	r := s.getRune()
    499 	if r != eof {
    500 		s.UnreadRune()
    501 	}
    502 	return indexRune(ok, r) >= 0
    503 }
    504 
    505 func (s *ss) notEOF() {
    506 	// Guarantee there is data to be read.
    507 	if r := s.getRune(); r == eof {
    508 		panic(io.EOF)
    509 	}
    510 	s.UnreadRune()
    511 }
    512 
    513 // accept checks the next rune in the input. If it's a byte (sic) in the string, it puts it in the
    514 // buffer and returns true. Otherwise it return false.
    515 func (s *ss) accept(ok string) bool {
    516 	return s.consume(ok, true)
    517 }
    518 
    519 // okVerb verifies that the verb is present in the list, setting s.err appropriately if not.
    520 func (s *ss) okVerb(verb rune, okVerbs, typ string) bool {
    521 	for _, v := range okVerbs {
    522 		if v == verb {
    523 			return true
    524 		}
    525 	}
    526 	s.errorString("bad verb '%" + string(verb) + "' for " + typ)
    527 	return false
    528 }
    529 
    530 // scanBool returns the value of the boolean represented by the next token.
    531 func (s *ss) scanBool(verb rune) bool {
    532 	s.SkipSpace()
    533 	s.notEOF()
    534 	if !s.okVerb(verb, "tv", "boolean") {
    535 		return false
    536 	}
    537 	// Syntax-checking a boolean is annoying. We're not fastidious about case.
    538 	switch s.getRune() {
    539 	case '0':
    540 		return false
    541 	case '1':
    542 		return true
    543 	case 't', 'T':
    544 		if s.accept("rR") && (!s.accept("uU") || !s.accept("eE")) {
    545 			s.error(boolError)
    546 		}
    547 		return true
    548 	case 'f', 'F':
    549 		if s.accept("aA") && (!s.accept("lL") || !s.accept("sS") || !s.accept("eE")) {
    550 			s.error(boolError)
    551 		}
    552 		return false
    553 	}
    554 	return false
    555 }
    556 
    557 // Numerical elements
    558 const (
    559 	binaryDigits      = "01"
    560 	octalDigits       = "01234567"
    561 	decimalDigits     = "0123456789"
    562 	hexadecimalDigits = "0123456789aAbBcCdDeEfF"
    563 	sign              = "+-"
    564 	period            = "."
    565 	exponent          = "eEp"
    566 )
    567 
    568 // getBase returns the numeric base represented by the verb and its digit string.
    569 func (s *ss) getBase(verb rune) (base int, digits string) {
    570 	s.okVerb(verb, "bdoUxXv", "integer") // sets s.err
    571 	base = 10
    572 	digits = decimalDigits
    573 	switch verb {
    574 	case 'b':
    575 		base = 2
    576 		digits = binaryDigits
    577 	case 'o':
    578 		base = 8
    579 		digits = octalDigits
    580 	case 'x', 'X', 'U':
    581 		base = 16
    582 		digits = hexadecimalDigits
    583 	}
    584 	return
    585 }
    586 
    587 // scanNumber returns the numerical string with specified digits starting here.
    588 func (s *ss) scanNumber(digits string, haveDigits bool) string {
    589 	if !haveDigits {
    590 		s.notEOF()
    591 		if !s.accept(digits) {
    592 			s.errorString("expected integer")
    593 		}
    594 	}
    595 	for s.accept(digits) {
    596 	}
    597 	return string(s.buf)
    598 }
    599 
    600 // scanRune returns the next rune value in the input.
    601 func (s *ss) scanRune(bitSize int) int64 {
    602 	s.notEOF()
    603 	r := int64(s.getRune())
    604 	n := uint(bitSize)
    605 	x := (r << (64 - n)) >> (64 - n)
    606 	if x != r {
    607 		s.errorString("overflow on character value " + string(r))
    608 	}
    609 	return r
    610 }
    611 
    612 // scanBasePrefix reports whether the integer begins with a 0 or 0x,
    613 // and returns the base, digit string, and whether a zero was found.
    614 // It is called only if the verb is %v.
    615 func (s *ss) scanBasePrefix() (base int, digits string, found bool) {
    616 	if !s.peek("0") {
    617 		return 10, decimalDigits, false
    618 	}
    619 	s.accept("0")
    620 	found = true // We've put a digit into the token buffer.
    621 	// Special cases for '0' && '0x'
    622 	base, digits = 8, octalDigits
    623 	if s.peek("xX") {
    624 		s.consume("xX", false)
    625 		base, digits = 16, hexadecimalDigits
    626 	}
    627 	return
    628 }
    629 
    630 // scanInt returns the value of the integer represented by the next
    631 // token, checking for overflow. Any error is stored in s.err.
    632 func (s *ss) scanInt(verb rune, bitSize int) int64 {
    633 	if verb == 'c' {
    634 		return s.scanRune(bitSize)
    635 	}
    636 	s.SkipSpace()
    637 	s.notEOF()
    638 	base, digits := s.getBase(verb)
    639 	haveDigits := false
    640 	if verb == 'U' {
    641 		if !s.consume("U", false) || !s.consume("+", false) {
    642 			s.errorString("bad unicode format ")
    643 		}
    644 	} else {
    645 		s.accept(sign) // If there's a sign, it will be left in the token buffer.
    646 		if verb == 'v' {
    647 			base, digits, haveDigits = s.scanBasePrefix()
    648 		}
    649 	}
    650 	tok := s.scanNumber(digits, haveDigits)
    651 	i, err := strconv.ParseInt(tok, base, 64)
    652 	if err != nil {
    653 		s.error(err)
    654 	}
    655 	n := uint(bitSize)
    656 	x := (i << (64 - n)) >> (64 - n)
    657 	if x != i {
    658 		s.errorString("integer overflow on token " + tok)
    659 	}
    660 	return i
    661 }
    662 
    663 // scanUint returns the value of the unsigned integer represented
    664 // by the next token, checking for overflow. Any error is stored in s.err.
    665 func (s *ss) scanUint(verb rune, bitSize int) uint64 {
    666 	if verb == 'c' {
    667 		return uint64(s.scanRune(bitSize))
    668 	}
    669 	s.SkipSpace()
    670 	s.notEOF()
    671 	base, digits := s.getBase(verb)
    672 	haveDigits := false
    673 	if verb == 'U' {
    674 		if !s.consume("U", false) || !s.consume("+", false) {
    675 			s.errorString("bad unicode format ")
    676 		}
    677 	} else if verb == 'v' {
    678 		base, digits, haveDigits = s.scanBasePrefix()
    679 	}
    680 	tok := s.scanNumber(digits, haveDigits)
    681 	i, err := strconv.ParseUint(tok, base, 64)
    682 	if err != nil {
    683 		s.error(err)
    684 	}
    685 	n := uint(bitSize)
    686 	x := (i << (64 - n)) >> (64 - n)
    687 	if x != i {
    688 		s.errorString("unsigned integer overflow on token " + tok)
    689 	}
    690 	return i
    691 }
    692 
    693 // floatToken returns the floating-point number starting here, no longer than swid
    694 // if the width is specified. It's not rigorous about syntax because it doesn't check that
    695 // we have at least some digits, but Atof will do that.
    696 func (s *ss) floatToken() string {
    697 	s.buf = s.buf[:0]
    698 	// NaN?
    699 	if s.accept("nN") && s.accept("aA") && s.accept("nN") {
    700 		return string(s.buf)
    701 	}
    702 	// leading sign?
    703 	s.accept(sign)
    704 	// Inf?
    705 	if s.accept("iI") && s.accept("nN") && s.accept("fF") {
    706 		return string(s.buf)
    707 	}
    708 	// digits?
    709 	for s.accept(decimalDigits) {
    710 	}
    711 	// decimal point?
    712 	if s.accept(period) {
    713 		// fraction?
    714 		for s.accept(decimalDigits) {
    715 		}
    716 	}
    717 	// exponent?
    718 	if s.accept(exponent) {
    719 		// leading sign?
    720 		s.accept(sign)
    721 		// digits?
    722 		for s.accept(decimalDigits) {
    723 		}
    724 	}
    725 	return string(s.buf)
    726 }
    727 
    728 // complexTokens returns the real and imaginary parts of the complex number starting here.
    729 // The number might be parenthesized and has the format (N+Ni) where N is a floating-point
    730 // number and there are no spaces within.
    731 func (s *ss) complexTokens() (real, imag string) {
    732 	// TODO: accept N and Ni independently?
    733 	parens := s.accept("(")
    734 	real = s.floatToken()
    735 	s.buf = s.buf[:0]
    736 	// Must now have a sign.
    737 	if !s.accept("+-") {
    738 		s.error(complexError)
    739 	}
    740 	// Sign is now in buffer
    741 	imagSign := string(s.buf)
    742 	imag = s.floatToken()
    743 	if !s.accept("i") {
    744 		s.error(complexError)
    745 	}
    746 	if parens && !s.accept(")") {
    747 		s.error(complexError)
    748 	}
    749 	return real, imagSign + imag
    750 }
    751 
    752 // convertFloat converts the string to a float64value.
    753 func (s *ss) convertFloat(str string, n int) float64 {
    754 	if p := indexRune(str, 'p'); p >= 0 {
    755 		// Atof doesn't handle power-of-2 exponents,
    756 		// but they're easy to evaluate.
    757 		f, err := strconv.ParseFloat(str[:p], n)
    758 		if err != nil {
    759 			// Put full string into error.
    760 			if e, ok := err.(*strconv.NumError); ok {
    761 				e.Num = str
    762 			}
    763 			s.error(err)
    764 		}
    765 		m, err := strconv.Atoi(str[p+1:])
    766 		if err != nil {
    767 			// Put full string into error.
    768 			if e, ok := err.(*strconv.NumError); ok {
    769 				e.Num = str
    770 			}
    771 			s.error(err)
    772 		}
    773 		return math.Ldexp(f, m)
    774 	}
    775 	f, err := strconv.ParseFloat(str, n)
    776 	if err != nil {
    777 		s.error(err)
    778 	}
    779 	return f
    780 }
    781 
    782 // convertComplex converts the next token to a complex128 value.
    783 // The atof argument is a type-specific reader for the underlying type.
    784 // If we're reading complex64, atof will parse float32s and convert them
    785 // to float64's to avoid reproducing this code for each complex type.
    786 func (s *ss) scanComplex(verb rune, n int) complex128 {
    787 	if !s.okVerb(verb, floatVerbs, "complex") {
    788 		return 0
    789 	}
    790 	s.SkipSpace()
    791 	s.notEOF()
    792 	sreal, simag := s.complexTokens()
    793 	real := s.convertFloat(sreal, n/2)
    794 	imag := s.convertFloat(simag, n/2)
    795 	return complex(real, imag)
    796 }
    797 
    798 // convertString returns the string represented by the next input characters.
    799 // The format of the input is determined by the verb.
    800 func (s *ss) convertString(verb rune) (str string) {
    801 	if !s.okVerb(verb, "svqxX", "string") {
    802 		return ""
    803 	}
    804 	s.SkipSpace()
    805 	s.notEOF()
    806 	switch verb {
    807 	case 'q':
    808 		str = s.quotedString()
    809 	case 'x', 'X':
    810 		str = s.hexString()
    811 	default:
    812 		str = string(s.token(true, notSpace)) // %s and %v just return the next word
    813 	}
    814 	return
    815 }
    816 
    817 // quotedString returns the double- or back-quoted string represented by the next input characters.
    818 func (s *ss) quotedString() string {
    819 	s.notEOF()
    820 	quote := s.getRune()
    821 	switch quote {
    822 	case '`':
    823 		// Back-quoted: Anything goes until EOF or back quote.
    824 		for {
    825 			r := s.mustReadRune()
    826 			if r == quote {
    827 				break
    828 			}
    829 			s.buf.WriteRune(r)
    830 		}
    831 		return string(s.buf)
    832 	case '"':
    833 		// Double-quoted: Include the quotes and let strconv.Unquote do the backslash escapes.
    834 		s.buf.WriteByte('"')
    835 		for {
    836 			r := s.mustReadRune()
    837 			s.buf.WriteRune(r)
    838 			if r == '\\' {
    839 				// In a legal backslash escape, no matter how long, only the character
    840 				// immediately after the escape can itself be a backslash or quote.
    841 				// Thus we only need to protect the first character after the backslash.
    842 				s.buf.WriteRune(s.mustReadRune())
    843 			} else if r == '"' {
    844 				break
    845 			}
    846 		}
    847 		result, err := strconv.Unquote(string(s.buf))
    848 		if err != nil {
    849 			s.error(err)
    850 		}
    851 		return result
    852 	default:
    853 		s.errorString("expected quoted string")
    854 	}
    855 	return ""
    856 }
    857 
    858 // hexDigit returns the value of the hexadecimal digit.
    859 func hexDigit(d rune) (int, bool) {
    860 	digit := int(d)
    861 	switch digit {
    862 	case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
    863 		return digit - '0', true
    864 	case 'a', 'b', 'c', 'd', 'e', 'f':
    865 		return 10 + digit - 'a', true
    866 	case 'A', 'B', 'C', 'D', 'E', 'F':
    867 		return 10 + digit - 'A', true
    868 	}
    869 	return -1, false
    870 }
    871 
    872 // hexByte returns the next hex-encoded (two-character) byte from the input.
    873 // It returns ok==false if the next bytes in the input do not encode a hex byte.
    874 // If the first byte is hex and the second is not, processing stops.
    875 func (s *ss) hexByte() (b byte, ok bool) {
    876 	rune1 := s.getRune()
    877 	if rune1 == eof {
    878 		return
    879 	}
    880 	value1, ok := hexDigit(rune1)
    881 	if !ok {
    882 		s.UnreadRune()
    883 		return
    884 	}
    885 	value2, ok := hexDigit(s.mustReadRune())
    886 	if !ok {
    887 		s.errorString("illegal hex digit")
    888 		return
    889 	}
    890 	return byte(value1<<4 | value2), true
    891 }
    892 
    893 // hexString returns the space-delimited hexpair-encoded string.
    894 func (s *ss) hexString() string {
    895 	s.notEOF()
    896 	for {
    897 		b, ok := s.hexByte()
    898 		if !ok {
    899 			break
    900 		}
    901 		s.buf.WriteByte(b)
    902 	}
    903 	if len(s.buf) == 0 {
    904 		s.errorString("no hex data for %x string")
    905 		return ""
    906 	}
    907 	return string(s.buf)
    908 }
    909 
    910 const (
    911 	floatVerbs = "beEfFgGv"
    912 
    913 	hugeWid = 1 << 30
    914 
    915 	intBits     = 32 << (^uint(0) >> 63)
    916 	uintptrBits = 32 << (^uintptr(0) >> 63)
    917 )
    918 
    919 // scanOne scans a single value, deriving the scanner from the type of the argument.
    920 func (s *ss) scanOne(verb rune, arg interface{}) {
    921 	s.buf = s.buf[:0]
    922 	var err error
    923 	// If the parameter has its own Scan method, use that.
    924 	if v, ok := arg.(Scanner); ok {
    925 		err = v.Scan(s, verb)
    926 		if err != nil {
    927 			if err == io.EOF {
    928 				err = io.ErrUnexpectedEOF
    929 			}
    930 			s.error(err)
    931 		}
    932 		return
    933 	}
    934 
    935 	switch v := arg.(type) {
    936 	case *bool:
    937 		*v = s.scanBool(verb)
    938 	case *complex64:
    939 		*v = complex64(s.scanComplex(verb, 64))
    940 	case *complex128:
    941 		*v = s.scanComplex(verb, 128)
    942 	case *int:
    943 		*v = int(s.scanInt(verb, intBits))
    944 	case *int8:
    945 		*v = int8(s.scanInt(verb, 8))
    946 	case *int16:
    947 		*v = int16(s.scanInt(verb, 16))
    948 	case *int32:
    949 		*v = int32(s.scanInt(verb, 32))
    950 	case *int64:
    951 		*v = s.scanInt(verb, 64)
    952 	case *uint:
    953 		*v = uint(s.scanUint(verb, intBits))
    954 	case *uint8:
    955 		*v = uint8(s.scanUint(verb, 8))
    956 	case *uint16:
    957 		*v = uint16(s.scanUint(verb, 16))
    958 	case *uint32:
    959 		*v = uint32(s.scanUint(verb, 32))
    960 	case *uint64:
    961 		*v = s.scanUint(verb, 64)
    962 	case *uintptr:
    963 		*v = uintptr(s.scanUint(verb, uintptrBits))
    964 	// Floats are tricky because you want to scan in the precision of the result, not
    965 	// scan in high precision and convert, in order to preserve the correct error condition.
    966 	case *float32:
    967 		if s.okVerb(verb, floatVerbs, "float32") {
    968 			s.SkipSpace()
    969 			s.notEOF()
    970 			*v = float32(s.convertFloat(s.floatToken(), 32))
    971 		}
    972 	case *float64:
    973 		if s.okVerb(verb, floatVerbs, "float64") {
    974 			s.SkipSpace()
    975 			s.notEOF()
    976 			*v = s.convertFloat(s.floatToken(), 64)
    977 		}
    978 	case *string:
    979 		*v = s.convertString(verb)
    980 	case *[]byte:
    981 		// We scan to string and convert so we get a copy of the data.
    982 		// If we scanned to bytes, the slice would point at the buffer.
    983 		*v = []byte(s.convertString(verb))
    984 	default:
    985 		val := reflect.ValueOf(v)
    986 		ptr := val
    987 		if ptr.Kind() != reflect.Ptr {
    988 			s.errorString("type not a pointer: " + val.Type().String())
    989 			return
    990 		}
    991 		switch v := ptr.Elem(); v.Kind() {
    992 		case reflect.Bool:
    993 			v.SetBool(s.scanBool(verb))
    994 		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    995 			v.SetInt(s.scanInt(verb, v.Type().Bits()))
    996 		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    997 			v.SetUint(s.scanUint(verb, v.Type().Bits()))
    998 		case reflect.String:
    999 			v.SetString(s.convertString(verb))
   1000 		case reflect.Slice:
   1001 			// For now, can only handle (renamed) []byte.
   1002 			typ := v.Type()
   1003 			if typ.Elem().Kind() != reflect.Uint8 {
   1004 				s.errorString("can't scan type: " + val.Type().String())
   1005 			}
   1006 			str := s.convertString(verb)
   1007 			v.Set(reflect.MakeSlice(typ, len(str), len(str)))
   1008 			for i := 0; i < len(str); i++ {
   1009 				v.Index(i).SetUint(uint64(str[i]))
   1010 			}
   1011 		case reflect.Float32, reflect.Float64:
   1012 			s.SkipSpace()
   1013 			s.notEOF()
   1014 			v.SetFloat(s.convertFloat(s.floatToken(), v.Type().Bits()))
   1015 		case reflect.Complex64, reflect.Complex128:
   1016 			v.SetComplex(s.scanComplex(verb, v.Type().Bits()))
   1017 		default:
   1018 			s.errorString("can't scan type: " + val.Type().String())
   1019 		}
   1020 	}
   1021 }
   1022 
   1023 // errorHandler turns local panics into error returns.
   1024 func errorHandler(errp *error) {
   1025 	if e := recover(); e != nil {
   1026 		if se, ok := e.(scanError); ok { // catch local error
   1027 			*errp = se.err
   1028 		} else if eof, ok := e.(error); ok && eof == io.EOF { // out of input
   1029 			*errp = eof
   1030 		} else {
   1031 			panic(e)
   1032 		}
   1033 	}
   1034 }
   1035 
   1036 // doScan does the real work for scanning without a format string.
   1037 func (s *ss) doScan(a []interface{}) (numProcessed int, err error) {
   1038 	defer errorHandler(&err)
   1039 	for _, arg := range a {
   1040 		s.scanOne('v', arg)
   1041 		numProcessed++
   1042 	}
   1043 	// Check for newline (or EOF) if required (Scanln etc.).
   1044 	if s.nlIsEnd {
   1045 		for {
   1046 			r := s.getRune()
   1047 			if r == '\n' || r == eof {
   1048 				break
   1049 			}
   1050 			if !isSpace(r) {
   1051 				s.errorString("expected newline")
   1052 				break
   1053 			}
   1054 		}
   1055 	}
   1056 	return
   1057 }
   1058 
   1059 // advance determines whether the next characters in the input match
   1060 // those of the format. It returns the number of bytes (sic) consumed
   1061 // in the format. All runs of space characters in either input or
   1062 // format behave as a single space. Newlines are special, though:
   1063 // newlines in the format must match those in the input and vice versa.
   1064 // This routine also handles the %% case. If the return value is zero,
   1065 // either format starts with a % (with no following %) or the input
   1066 // is empty. If it is negative, the input did not match the string.
   1067 func (s *ss) advance(format string) (i int) {
   1068 	for i < len(format) {
   1069 		fmtc, w := utf8.DecodeRuneInString(format[i:])
   1070 
   1071 		// Space processing.
   1072 		// In the rest of this comment "space" means spaces other than newline.
   1073 		// Newline in the format matches input of zero or more spaces and then newline or end-of-input.
   1074 		// Spaces in the format before the newline are collapsed into the newline.
   1075 		// Spaces in the format after the newline match zero or more spaces after the corresponding input newline.
   1076 		// Other spaces in the format match input of one or more spaces or end-of-input.
   1077 		if isSpace(fmtc) {
   1078 			newlines := 0
   1079 			trailingSpace := false
   1080 			for isSpace(fmtc) && i < len(format) {
   1081 				if fmtc == '\n' {
   1082 					newlines++
   1083 					trailingSpace = false
   1084 				} else {
   1085 					trailingSpace = true
   1086 				}
   1087 				i += w
   1088 				fmtc, w = utf8.DecodeRuneInString(format[i:])
   1089 			}
   1090 			for j := 0; j < newlines; j++ {
   1091 				inputc := s.getRune()
   1092 				for isSpace(inputc) && inputc != '\n' {
   1093 					inputc = s.getRune()
   1094 				}
   1095 				if inputc != '\n' && inputc != eof {
   1096 					s.errorString("newline in format does not match input")
   1097 				}
   1098 			}
   1099 			if trailingSpace {
   1100 				inputc := s.getRune()
   1101 				if newlines == 0 {
   1102 					// If the trailing space stood alone (did not follow a newline),
   1103 					// it must find at least one space to consume.
   1104 					if !isSpace(inputc) && inputc != eof {
   1105 						s.errorString("expected space in input to match format")
   1106 					}
   1107 					if inputc == '\n' {
   1108 						s.errorString("newline in input does not match format")
   1109 					}
   1110 				}
   1111 				for isSpace(inputc) && inputc != '\n' {
   1112 					inputc = s.getRune()
   1113 				}
   1114 				if inputc != eof {
   1115 					s.UnreadRune()
   1116 				}
   1117 			}
   1118 			continue
   1119 		}
   1120 
   1121 		// Verbs.
   1122 		if fmtc == '%' {
   1123 			// % at end of string is an error.
   1124 			if i+w == len(format) {
   1125 				s.errorString("missing verb: % at end of format string")
   1126 			}
   1127 			// %% acts like a real percent
   1128 			nextc, _ := utf8.DecodeRuneInString(format[i+w:]) // will not match % if string is empty
   1129 			if nextc != '%' {
   1130 				return
   1131 			}
   1132 			i += w // skip the first %
   1133 		}
   1134 
   1135 		// Literals.
   1136 		inputc := s.mustReadRune()
   1137 		if fmtc != inputc {
   1138 			s.UnreadRune()
   1139 			return -1
   1140 		}
   1141 		i += w
   1142 	}
   1143 	return
   1144 }
   1145 
   1146 // doScanf does the real work when scanning with a format string.
   1147 // At the moment, it handles only pointers to basic types.
   1148 func (s *ss) doScanf(format string, a []interface{}) (numProcessed int, err error) {
   1149 	defer errorHandler(&err)
   1150 	end := len(format) - 1
   1151 	// We process one item per non-trivial format
   1152 	for i := 0; i <= end; {
   1153 		w := s.advance(format[i:])
   1154 		if w > 0 {
   1155 			i += w
   1156 			continue
   1157 		}
   1158 		// Either we failed to advance, we have a percent character, or we ran out of input.
   1159 		if format[i] != '%' {
   1160 			// Can't advance format. Why not?
   1161 			if w < 0 {
   1162 				s.errorString("input does not match format")
   1163 			}
   1164 			// Otherwise at EOF; "too many operands" error handled below
   1165 			break
   1166 		}
   1167 		i++ // % is one byte
   1168 
   1169 		// do we have 20 (width)?
   1170 		var widPresent bool
   1171 		s.maxWid, widPresent, i = parsenum(format, i, end)
   1172 		if !widPresent {
   1173 			s.maxWid = hugeWid
   1174 		}
   1175 
   1176 		c, w := utf8.DecodeRuneInString(format[i:])
   1177 		i += w
   1178 
   1179 		if c != 'c' {
   1180 			s.SkipSpace()
   1181 		}
   1182 		s.argLimit = s.limit
   1183 		if f := s.count + s.maxWid; f < s.argLimit {
   1184 			s.argLimit = f
   1185 		}
   1186 
   1187 		if numProcessed >= len(a) { // out of operands
   1188 			s.errorString("too few operands for format '%" + format[i-w:] + "'")
   1189 			break
   1190 		}
   1191 		arg := a[numProcessed]
   1192 
   1193 		s.scanOne(c, arg)
   1194 		numProcessed++
   1195 		s.argLimit = s.limit
   1196 	}
   1197 	if numProcessed < len(a) {
   1198 		s.errorString("too many operands")
   1199 	}
   1200 	return
   1201 }
   1202