Source file src/pkg/fmt/scan.go
1
2
3
4
5 package fmt
6
7 import (
8 "errors"
9 "io"
10 "math"
11 "os"
12 "reflect"
13 "strconv"
14 "unicode/utf8"
15 )
16
17
18
19
20
21 type runeUnreader interface {
22 UnreadRune() error
23 }
24
25
26
27
28 type ScanState interface {
29
30
31
32
33 ReadRune() (r rune, size int, err error)
34
35 UnreadRune() error
36
37
38
39 SkipSpace()
40
41
42
43
44
45
46
47
48 Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
49
50
51 Width() (wid int, ok bool)
52
53
54
55 Read(buf []byte) (n int, err error)
56 }
57
58
59
60
61
62 type Scanner interface {
63 Scan(state ScanState, verb rune) error
64 }
65
66
67
68
69
70 func Scan(a ...interface{}) (n int, err error) {
71 return Fscan(os.Stdin, a...)
72 }
73
74
75
76 func Scanln(a ...interface{}) (n int, err error) {
77 return Fscanln(os.Stdin, a...)
78 }
79
80
81
82
83 func Scanf(format string, a ...interface{}) (n int, err error) {
84 return Fscanf(os.Stdin, format, a...)
85 }
86
87 type stringReader string
88
89 func (r *stringReader) Read(b []byte) (n int, err error) {
90 n = copy(b, *r)
91 *r = (*r)[n:]
92 if n == 0 {
93 err = io.EOF
94 }
95 return
96 }
97
98
99
100
101
102 func Sscan(str string, a ...interface{}) (n int, err error) {
103 return Fscan((*stringReader)(&str), a...)
104 }
105
106
107
108 func Sscanln(str string, a ...interface{}) (n int, err error) {
109 return Fscanln((*stringReader)(&str), a...)
110 }
111
112
113
114
115 func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
116 return Fscanf((*stringReader)(&str), format, a...)
117 }
118
119
120
121
122
123 func Fscan(r io.Reader, a ...interface{}) (n int, err error) {
124 s, old := newScanState(r, true, false)
125 n, err = s.doScan(a)
126 s.free(old)
127 return
128 }
129
130
131
132 func Fscanln(r io.Reader, a ...interface{}) (n int, err error) {
133 s, old := newScanState(r, false, true)
134 n, err = s.doScan(a)
135 s.free(old)
136 return
137 }
138
139
140
141
142 func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) {
143 s, old := newScanState(r, false, false)
144 n, err = s.doScanf(format, a)
145 s.free(old)
146 return
147 }
148
149
150
151 type scanError struct {
152 err error
153 }
154
155 const eof = -1
156
157
158 type ss struct {
159 rr io.RuneReader
160 buf buffer
161 peekRune rune
162 prevRune rune
163 count int
164 atEOF bool
165 ssave
166 }
167
168
169
170 type ssave struct {
171 validSave bool
172 nlIsEnd bool
173 nlIsSpace bool
174 fieldLimit int
175 limit int
176 maxWid int
177 }
178
179
180
181
182 func (s *ss) Read(buf []byte) (n int, err error) {
183 return 0, errors.New("ScanState's Read should not be called. Use ReadRune")
184 }
185
186 func (s *ss) ReadRune() (r rune, size int, err error) {
187 if s.peekRune >= 0 {
188 s.count++
189 r = s.peekRune
190 size = utf8.RuneLen(r)
191 s.prevRune = r
192 s.peekRune = -1
193 return
194 }
195 if s.atEOF || s.nlIsEnd && s.prevRune == '\n' || s.count >= s.fieldLimit {
196 err = io.EOF
197 return
198 }
199
200 r, size, err = s.rr.ReadRune()
201 if err == nil {
202 s.count++
203 s.prevRune = r
204 } else if err == io.EOF {
205 s.atEOF = true
206 }
207 return
208 }
209
210 func (s *ss) Width() (wid int, ok bool) {
211 if s.maxWid == hugeWid {
212 return 0, false
213 }
214 return s.maxWid, true
215 }
216
217
218
219 func (s *ss) getRune() (r rune) {
220 r, _, err := s.ReadRune()
221 if err != nil {
222 if err == io.EOF {
223 return eof
224 }
225 s.error(err)
226 }
227 return
228 }
229
230
231
232
233 func (s *ss) mustReadRune() (r rune) {
234 r = s.getRune()
235 if r == eof {
236 s.error(io.ErrUnexpectedEOF)
237 }
238 return
239 }
240
241 func (s *ss) UnreadRune() error {
242 if u, ok := s.rr.(runeUnreader); ok {
243 u.UnreadRune()
244 } else {
245 s.peekRune = s.prevRune
246 }
247 s.prevRune = -1
248 s.count--
249 return nil
250 }
251
252 func (s *ss) error(err error) {
253 panic(scanError{err})
254 }
255
256 func (s *ss) errorString(err string) {
257 panic(scanError{errors.New(err)})
258 }
259
260 func (s *ss) Token(skipSpace bool, f func(rune) bool) (tok []byte, err error) {
261 defer func() {
262 if e := recover(); e != nil {
263 if se, ok := e.(scanError); ok {
264 err = se.err
265 } else {
266 panic(e)
267 }
268 }
269 }()
270 if f == nil {
271 f = notSpace
272 }
273 s.buf = s.buf[:0]
274 tok = s.token(skipSpace, f)
275 return
276 }
277
278
279
280 var space = [][2]uint16{
281 {0x0009, 0x000d},
282 {0x0020, 0x0020},
283 {0x0085, 0x0085},
284 {0x00a0, 0x00a0},
285 {0x1680, 0x1680},
286 {0x180e, 0x180e},
287 {0x2000, 0x200a},
288 {0x2028, 0x2029},
289 {0x202f, 0x202f},
290 {0x205f, 0x205f},
291 {0x3000, 0x3000},
292 }
293
294 func isSpace(r rune) bool {
295 if r >= 1<<16 {
296 return false
297 }
298 rx := uint16(r)
299 for _, rng := range space {
300 if rx < rng[0] {
301 return false
302 }
303 if rx <= rng[1] {
304 return true
305 }
306 }
307 return false
308 }
309
310
311 func notSpace(r rune) bool {
312 return !isSpace(r)
313 }
314
315
316
317
318 func (s *ss) SkipSpace() {
319 s.skipSpace(false)
320 }
321
322
323
324
325 type readRune struct {
326 reader io.Reader
327 buf [utf8.UTFMax]byte
328 pending int
329 pendBuf [utf8.UTFMax]byte
330 }
331
332
333
334 func (r *readRune) readByte() (b byte, err error) {
335 if r.pending > 0 {
336 b = r.pendBuf[0]
337 copy(r.pendBuf[0:], r.pendBuf[1:])
338 r.pending--
339 return
340 }
341 n, err := io.ReadFull(r.reader, r.pendBuf[0:1])
342 if n != 1 {
343 return 0, err
344 }
345 return r.pendBuf[0], err
346 }
347
348
349 func (r *readRune) unread(buf []byte) {
350 copy(r.pendBuf[r.pending:], buf)
351 r.pending += len(buf)
352 }
353
354
355
356 func (r *readRune) ReadRune() (rr rune, size int, err error) {
357 r.buf[0], err = r.readByte()
358 if err != nil {
359 return 0, 0, err
360 }
361 if r.buf[0] < utf8.RuneSelf {
362 rr = rune(r.buf[0])
363 return
364 }
365 var n int
366 for n = 1; !utf8.FullRune(r.buf[0:n]); n++ {
367 r.buf[n], err = r.readByte()
368 if err != nil {
369 if err == io.EOF {
370 err = nil
371 break
372 }
373 return
374 }
375 }
376 rr, size = utf8.DecodeRune(r.buf[0:n])
377 if size < n {
378 r.unread(r.buf[size:n])
379 }
380 return
381 }
382
383 var ssFree = newCache(func() interface{} { return new(ss) })
384
385
386 func newScanState(r io.Reader, nlIsSpace, nlIsEnd bool) (s *ss, old ssave) {
387
388
389 s, ok := r.(*ss)
390 if ok {
391 old = s.ssave
392 s.limit = s.fieldLimit
393 s.nlIsEnd = nlIsEnd || s.nlIsEnd
394 s.nlIsSpace = nlIsSpace
395 return
396 }
397
398 s = ssFree.get().(*ss)
399 if rr, ok := r.(io.RuneReader); ok {
400 s.rr = rr
401 } else {
402 s.rr = &readRune{reader: r}
403 }
404 s.nlIsSpace = nlIsSpace
405 s.nlIsEnd = nlIsEnd
406 s.prevRune = -1
407 s.peekRune = -1
408 s.atEOF = false
409 s.limit = hugeWid
410 s.fieldLimit = hugeWid
411 s.maxWid = hugeWid
412 s.validSave = true
413 s.count = 0
414 return
415 }
416
417
418 func (s *ss) free(old ssave) {
419
420 if old.validSave {
421 s.ssave = old
422 return
423 }
424
425 if cap(s.buf) > 1024 {
426 return
427 }
428 s.buf = s.buf[:0]
429 s.rr = nil
430 ssFree.put(s)
431 }
432
433
434 func (s *ss) skipSpace(stopAtNewline bool) {
435 for {
436 r := s.getRune()
437 if r == eof {
438 return
439 }
440 if r == '\n' {
441 if stopAtNewline {
442 break
443 }
444 if s.nlIsSpace {
445 continue
446 }
447 s.errorString("unexpected newline")
448 return
449 }
450 if !isSpace(r) {
451 s.UnreadRune()
452 break
453 }
454 }
455 }
456
457
458
459
460 func (s *ss) token(skipSpace bool, f func(rune) bool) []byte {
461 if skipSpace {
462 s.skipSpace(false)
463 }
464
465 for {
466 r := s.getRune()
467 if r == eof {
468 break
469 }
470 if !f(r) {
471 s.UnreadRune()
472 break
473 }
474 s.buf.WriteRune(r)
475 }
476 return s.buf
477 }
478
479
480 func (s *ss) typeError(field interface{}, expected string) {
481 s.errorString("expected field of type pointer to " + expected + "; found " + reflect.TypeOf(field).String())
482 }
483
484 var complexError = errors.New("syntax error scanning complex number")
485 var boolError = errors.New("syntax error scanning boolean")
486
487 func indexRune(s string, r rune) int {
488 for i, c := range s {
489 if c == r {
490 return i
491 }
492 }
493 return -1
494 }
495
496
497
498 func (s *ss) consume(ok string, accept bool) bool {
499 r := s.getRune()
500 if r == eof {
501 return false
502 }
503 if indexRune(ok, r) >= 0 {
504 if accept {
505 s.buf.WriteRune(r)
506 }
507 return true
508 }
509 if r != eof && accept {
510 s.UnreadRune()
511 }
512 return false
513 }
514
515
516 func (s *ss) peek(ok string) bool {
517 r := s.getRune()
518 if r != eof {
519 s.UnreadRune()
520 }
521 return indexRune(ok, r) >= 0
522 }
523
524 func (s *ss) notEOF() {
525
526 if r := s.getRune(); r == eof {
527 panic(io.EOF)
528 }
529 s.UnreadRune()
530 }
531
532
533
534 func (s *ss) accept(ok string) bool {
535 return s.consume(ok, true)
536 }
537
538
539 func (s *ss) okVerb(verb rune, okVerbs, typ string) bool {
540 for _, v := range okVerbs {
541 if v == verb {
542 return true
543 }
544 }
545 s.errorString("bad verb %" + string(verb) + " for " + typ)
546 return false
547 }
548
549
550 func (s *ss) scanBool(verb rune) bool {
551 s.skipSpace(false)
552 s.notEOF()
553 if !s.okVerb(verb, "tv", "boolean") {
554 return false
555 }
556
557 switch s.getRune() {
558 case '0':
559 return false
560 case '1':
561 return true
562 case 't', 'T':
563 if s.accept("rR") && (!s.accept("uU") || !s.accept("eE")) {
564 s.error(boolError)
565 }
566 return true
567 case 'f', 'F':
568 if s.accept("aA") && (!s.accept("lL") || !s.accept("sS") || !s.accept("eE")) {
569 s.error(boolError)
570 }
571 return false
572 }
573 return false
574 }
575
576
577 const (
578 binaryDigits = "01"
579 octalDigits = "01234567"
580 decimalDigits = "0123456789"
581 hexadecimalDigits = "0123456789aAbBcCdDeEfF"
582 sign = "+-"
583 period = "."
584 exponent = "eEp"
585 )
586
587
588 func (s *ss) getBase(verb rune) (base int, digits string) {
589 s.okVerb(verb, "bdoUxXv", "integer")
590 base = 10
591 digits = decimalDigits
592 switch verb {
593 case 'b':
594 base = 2
595 digits = binaryDigits
596 case 'o':
597 base = 8
598 digits = octalDigits
599 case 'x', 'X', 'U':
600 base = 16
601 digits = hexadecimalDigits
602 }
603 return
604 }
605
606
607 func (s *ss) scanNumber(digits string, haveDigits bool) string {
608 if !haveDigits {
609 s.notEOF()
610 if !s.accept(digits) {
611 s.errorString("expected integer")
612 }
613 }
614 for s.accept(digits) {
615 }
616 return string(s.buf)
617 }
618
619
620 func (s *ss) scanRune(bitSize int) int64 {
621 s.notEOF()
622 r := int64(s.getRune())
623 n := uint(bitSize)
624 x := (r << (64 - n)) >> (64 - n)
625 if x != r {
626 s.errorString("overflow on character value " + string(r))
627 }
628 return r
629 }
630
631
632
633
634 func (s *ss) scanBasePrefix() (base int, digits string, found bool) {
635 if !s.peek("0") {
636 return 10, decimalDigits, false
637 }
638 s.accept("0")
639 found = true
640
641 base, digits = 8, octalDigits
642 if s.peek("xX") {
643 s.consume("xX", false)
644 base, digits = 16, hexadecimalDigits
645 }
646 return
647 }
648
649
650
651 func (s *ss) scanInt(verb rune, bitSize int) int64 {
652 if verb == 'c' {
653 return s.scanRune(bitSize)
654 }
655 s.skipSpace(false)
656 s.notEOF()
657 base, digits := s.getBase(verb)
658 haveDigits := false
659 if verb == 'U' {
660 if !s.consume("U", false) || !s.consume("+", false) {
661 s.errorString("bad unicode format ")
662 }
663 } else {
664 s.accept(sign)
665 if verb == 'v' {
666 base, digits, haveDigits = s.scanBasePrefix()
667 }
668 }
669 tok := s.scanNumber(digits, haveDigits)
670 i, err := strconv.ParseInt(tok, base, 64)
671 if err != nil {
672 s.error(err)
673 }
674 n := uint(bitSize)
675 x := (i << (64 - n)) >> (64 - n)
676 if x != i {
677 s.errorString("integer overflow on token " + tok)
678 }
679 return i
680 }
681
682
683
684 func (s *ss) scanUint(verb rune, bitSize int) uint64 {
685 if verb == 'c' {
686 return uint64(s.scanRune(bitSize))
687 }
688 s.skipSpace(false)
689 s.notEOF()
690 base, digits := s.getBase(verb)
691 haveDigits := false
692 if verb == 'U' {
693 if !s.consume("U", false) || !s.consume("+", false) {
694 s.errorString("bad unicode format ")
695 }
696 } else if verb == 'v' {
697 base, digits, haveDigits = s.scanBasePrefix()
698 }
699 tok := s.scanNumber(digits, haveDigits)
700 i, err := strconv.ParseUint(tok, base, 64)
701 if err != nil {
702 s.error(err)
703 }
704 n := uint(bitSize)
705 x := (i << (64 - n)) >> (64 - n)
706 if x != i {
707 s.errorString("unsigned integer overflow on token " + tok)
708 }
709 return i
710 }
711
712
713
714
715 func (s *ss) floatToken() string {
716 s.buf = s.buf[:0]
717
718 if s.accept("nN") && s.accept("aA") && s.accept("nN") {
719 return string(s.buf)
720 }
721
722 s.accept(sign)
723
724 if s.accept("iI") && s.accept("nN") && s.accept("fF") {
725 return string(s.buf)
726 }
727
728 for s.accept(decimalDigits) {
729 }
730
731 if s.accept(period) {
732
733 for s.accept(decimalDigits) {
734 }
735 }
736
737 if s.accept(exponent) {
738
739 s.accept(sign)
740
741 for s.accept(decimalDigits) {
742 }
743 }
744 return string(s.buf)
745 }
746
747
748
749
750 func (s *ss) complexTokens() (real, imag string) {
751
752 parens := s.accept("(")
753 real = s.floatToken()
754 s.buf = s.buf[:0]
755
756 if !s.accept("+-") {
757 s.error(complexError)
758 }
759
760 imagSign := string(s.buf)
761 imag = s.floatToken()
762 if !s.accept("i") {
763 s.error(complexError)
764 }
765 if parens && !s.accept(")") {
766 s.error(complexError)
767 }
768 return real, imagSign + imag
769 }
770
771
772 func (s *ss) convertFloat(str string, n int) float64 {
773 if p := indexRune(str, 'p'); p >= 0 {
774
775
776 f, err := strconv.ParseFloat(str[:p], n)
777 if err != nil {
778
779 if e, ok := err.(*strconv.NumError); ok {
780 e.Num = str
781 }
782 s.error(err)
783 }
784 n, err := strconv.Atoi(str[p+1:])
785 if err != nil {
786
787 if e, ok := err.(*strconv.NumError); ok {
788 e.Num = str
789 }
790 s.error(err)
791 }
792 return math.Ldexp(f, n)
793 }
794 f, err := strconv.ParseFloat(str, n)
795 if err != nil {
796 s.error(err)
797 }
798 return f
799 }
800
801
802
803
804
805 func (s *ss) scanComplex(verb rune, n int) complex128 {
806 if !s.okVerb(verb, floatVerbs, "complex") {
807 return 0
808 }
809 s.skipSpace(false)
810 s.notEOF()
811 sreal, simag := s.complexTokens()
812 real := s.convertFloat(sreal, n/2)
813 imag := s.convertFloat(simag, n/2)
814 return complex(real, imag)
815 }
816
817
818
819 func (s *ss) convertString(verb rune) (str string) {
820 if !s.okVerb(verb, "svqx", "string") {
821 return ""
822 }
823 s.skipSpace(false)
824 s.notEOF()
825 switch verb {
826 case 'q':
827 str = s.quotedString()
828 case 'x':
829 str = s.hexString()
830 default:
831 str = string(s.token(true, notSpace))
832 }
833 return
834 }
835
836
837 func (s *ss) quotedString() string {
838 s.notEOF()
839 quote := s.getRune()
840 switch quote {
841 case '`':
842
843 for {
844 r := s.mustReadRune()
845 if r == quote {
846 break
847 }
848 s.buf.WriteRune(r)
849 }
850 return string(s.buf)
851 case '"':
852
853 s.buf.WriteRune(quote)
854 for {
855 r := s.mustReadRune()
856 s.buf.WriteRune(r)
857 if r == '\\' {
858
859
860
861 r := s.mustReadRune()
862 s.buf.WriteRune(r)
863 } else if r == '"' {
864 break
865 }
866 }
867 result, err := strconv.Unquote(string(s.buf))
868 if err != nil {
869 s.error(err)
870 }
871 return result
872 default:
873 s.errorString("expected quoted string")
874 }
875 return ""
876 }
877
878
879 func (s *ss) hexDigit(d rune) int {
880 digit := int(d)
881 switch digit {
882 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
883 return digit - '0'
884 case 'a', 'b', 'c', 'd', 'e', 'f':
885 return 10 + digit - 'a'
886 case 'A', 'B', 'C', 'D', 'E', 'F':
887 return 10 + digit - 'A'
888 }
889 s.errorString("Scan: illegal hex digit")
890 return 0
891 }
892
893
894
895 func (s *ss) hexByte() (b byte, ok bool) {
896 rune1 := s.getRune()
897 if rune1 == eof {
898 return
899 }
900 if isSpace(rune1) {
901 s.UnreadRune()
902 return
903 }
904 rune2 := s.mustReadRune()
905 return byte(s.hexDigit(rune1)<<4 | s.hexDigit(rune2)), true
906 }
907
908
909 func (s *ss) hexString() string {
910 s.notEOF()
911 for {
912 b, ok := s.hexByte()
913 if !ok {
914 break
915 }
916 s.buf.WriteByte(b)
917 }
918 if len(s.buf) == 0 {
919 s.errorString("Scan: no hex data for %x string")
920 return ""
921 }
922 return string(s.buf)
923 }
924
925 const floatVerbs = "beEfFgGv"
926
927 const hugeWid = 1 << 30
928
929
930 func (s *ss) scanOne(verb rune, field interface{}) {
931 s.buf = s.buf[:0]
932 var err error
933
934 if v, ok := field.(Scanner); ok {
935 err = v.Scan(s, verb)
936 if err != nil {
937 if err == io.EOF {
938 err = io.ErrUnexpectedEOF
939 }
940 s.error(err)
941 }
942 return
943 }
944
945 switch v := field.(type) {
946 case *bool:
947 *v = s.scanBool(verb)
948 case *complex64:
949 *v = complex64(s.scanComplex(verb, 64))
950 case *complex128:
951 *v = s.scanComplex(verb, 128)
952 case *int:
953 *v = int(s.scanInt(verb, intBits))
954 case *int8:
955 *v = int8(s.scanInt(verb, 8))
956 case *int16:
957 *v = int16(s.scanInt(verb, 16))
958 case *int32:
959 *v = int32(s.scanInt(verb, 32))
960 case *int64:
961 *v = s.scanInt(verb, 64)
962 case *uint:
963 *v = uint(s.scanUint(verb, intBits))
964 case *uint8:
965 *v = uint8(s.scanUint(verb, 8))
966 case *uint16:
967 *v = uint16(s.scanUint(verb, 16))
968 case *uint32:
969 *v = uint32(s.scanUint(verb, 32))
970 case *uint64:
971 *v = s.scanUint(verb, 64)
972 case *uintptr:
973 *v = uintptr(s.scanUint(verb, uintptrBits))
974
975
976 case *float32:
977 if s.okVerb(verb, floatVerbs, "float32") {
978 s.skipSpace(false)
979 s.notEOF()
980 *v = float32(s.convertFloat(s.floatToken(), 32))
981 }
982 case *float64:
983 if s.okVerb(verb, floatVerbs, "float64") {
984 s.skipSpace(false)
985 s.notEOF()
986 *v = s.convertFloat(s.floatToken(), 64)
987 }
988 case *string:
989 *v = s.convertString(verb)
990 case *[]byte:
991
992
993 *v = []byte(s.convertString(verb))
994 default:
995 val := reflect.ValueOf(v)
996 ptr := val
997 if ptr.Kind() != reflect.Ptr {
998 s.errorString("Scan: type not a pointer: " + val.Type().String())
999 return
1000 }
1001 switch v := ptr.Elem(); v.Kind() {
1002 case reflect.Bool:
1003 v.SetBool(s.scanBool(verb))
1004 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1005 v.SetInt(s.scanInt(verb, v.Type().Bits()))
1006 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1007 v.SetUint(s.scanUint(verb, v.Type().Bits()))
1008 case reflect.String:
1009 v.SetString(s.convertString(verb))
1010 case reflect.Slice:
1011
1012 typ := v.Type()
1013 if typ.Elem().Kind() != reflect.Uint8 {
1014 s.errorString("Scan: can't handle type: " + val.Type().String())
1015 }
1016 str := s.convertString(verb)
1017 v.Set(reflect.MakeSlice(typ, len(str), len(str)))
1018 for i := 0; i < len(str); i++ {
1019 v.Index(i).SetUint(uint64(str[i]))
1020 }
1021 case reflect.Float32, reflect.Float64:
1022 s.skipSpace(false)
1023 s.notEOF()
1024 v.SetFloat(s.convertFloat(s.floatToken(), v.Type().Bits()))
1025 case reflect.Complex64, reflect.Complex128:
1026 v.SetComplex(s.scanComplex(verb, v.Type().Bits()))
1027 default:
1028 s.errorString("Scan: can't handle type: " + val.Type().String())
1029 }
1030 }
1031 }
1032
1033
1034 func errorHandler(errp *error) {
1035 if e := recover(); e != nil {
1036 if se, ok := e.(scanError); ok {
1037 *errp = se.err
1038 } else if eof, ok := e.(error); ok && eof == io.EOF {
1039 *errp = eof
1040 } else {
1041 panic(e)
1042 }
1043 }
1044 }
1045
1046
1047 func (s *ss) doScan(a []interface{}) (numProcessed int, err error) {
1048 defer errorHandler(&err)
1049 for _, field := range a {
1050 s.scanOne('v', field)
1051 numProcessed++
1052 }
1053
1054 if !s.nlIsSpace {
1055 for {
1056 r := s.getRune()
1057 if r == '\n' || r == eof {
1058 break
1059 }
1060 if !isSpace(r) {
1061 s.errorString("Scan: expected newline")
1062 break
1063 }
1064 }
1065 }
1066 return
1067 }
1068
1069
1070
1071
1072
1073
1074
1075
1076 func (s *ss) advance(format string) (i int) {
1077 for i < len(format) {
1078 fmtc, w := utf8.DecodeRuneInString(format[i:])
1079 if fmtc == '%' {
1080
1081 nextc, _ := utf8.DecodeRuneInString(format[i+w:])
1082 if nextc != '%' {
1083 return
1084 }
1085 i += w
1086 }
1087 sawSpace := false
1088 for isSpace(fmtc) && i < len(format) {
1089 sawSpace = true
1090 i += w
1091 fmtc, w = utf8.DecodeRuneInString(format[i:])
1092 }
1093 if sawSpace {
1094
1095
1096 inputc := s.getRune()
1097 if inputc == eof || inputc == '\n' {
1098
1099 return
1100 }
1101 if !isSpace(inputc) {
1102
1103 s.errorString("expected space in input to match format")
1104 }
1105 s.skipSpace(true)
1106 continue
1107 }
1108 inputc := s.mustReadRune()
1109 if fmtc != inputc {
1110 s.UnreadRune()
1111 return -1
1112 }
1113 i += w
1114 }
1115 return
1116 }
1117
1118
1119
1120 func (s *ss) doScanf(format string, a []interface{}) (numProcessed int, err error) {
1121 defer errorHandler(&err)
1122 end := len(format) - 1
1123
1124 for i := 0; i <= end; {
1125 w := s.advance(format[i:])
1126 if w > 0 {
1127 i += w
1128 continue
1129 }
1130
1131 if format[i] != '%' {
1132
1133 if w < 0 {
1134 s.errorString("input does not match format")
1135 }
1136
1137 break
1138 }
1139 i++
1140
1141
1142 var widPresent bool
1143 s.maxWid, widPresent, i = parsenum(format, i, end)
1144 if !widPresent {
1145 s.maxWid = hugeWid
1146 }
1147 s.fieldLimit = s.limit
1148 if f := s.count + s.maxWid; f < s.fieldLimit {
1149 s.fieldLimit = f
1150 }
1151
1152 c, w := utf8.DecodeRuneInString(format[i:])
1153 i += w
1154
1155 if numProcessed >= len(a) {
1156 s.errorString("too few operands for format %" + format[i-w:])
1157 break
1158 }
1159 field := a[numProcessed]
1160
1161 s.scanOne(c, field)
1162 numProcessed++
1163 s.fieldLimit = s.limit
1164 }
1165 if numProcessed < len(a) {
1166 s.errorString("too many operands")
1167 }
1168 return
1169 }
View as plain text