_ = ssFree <- s
}
-// skipSpace skips spaces and maybe newlines
-func (s *ss) skipSpace() {
+// skipSpace skips spaces and maybe newlines.
+func (s *ss) skipSpace(stopAtNewline bool) {
for {
rune := s.getRune()
if rune == EOF {
return
}
if rune == '\n' {
+ if stopAtNewline {
+ break
+ }
if s.nlIsSpace {
continue
}
// skips white space. For Scanln, it stops at newlines. For Scan,
// newlines are treated as spaces.
func (s *ss) token() string {
- s.skipSpace()
+ s.skipSpace(false)
// read until white space or newline
for nrunes := 0; !s.widPresent || nrunes < s.maxWid; nrunes++ {
rune := s.getRune()
return s.scanRune(bitSize)
}
base, digits := s.getBase(verb)
- s.skipSpace()
+ s.skipSpace(false)
s.accept(sign) // If there's a sign, it will be left in the token buffer.
tok := s.scanNumber(digits)
i, err := strconv.Btoi64(tok, base)
return uint64(s.scanRune(bitSize))
}
base, digits := s.getBase(verb)
- s.skipSpace()
+ s.skipSpace(false)
tok := s.scanNumber(digits)
i, err := strconv.Btoui64(tok, base)
if err != nil {
if !s.okVerb(verb, floatVerbs, "complex") {
return 0
}
- s.skipSpace()
+ s.skipSpace(false)
sreal, simag := s.complexTokens()
real := s.convertFloat(sreal, n/2)
imag := s.convertFloat(simag, n/2)
if !s.okVerb(verb, "svqx", "string") {
return ""
}
- s.skipSpace()
+ s.skipSpace(false)
switch verb {
case 'q':
return s.quotedString()
// scan in high precision and convert, in order to preserve the correct error condition.
case *float:
if s.okVerb(verb, floatVerbs, "float") {
- s.skipSpace()
+ s.skipSpace(false)
*v = float(s.convertFloat(s.floatToken(), int(floatBits)))
}
case *float32:
if s.okVerb(verb, floatVerbs, "float32") {
- s.skipSpace()
+ s.skipSpace(false)
*v = float32(s.convertFloat(s.floatToken(), 32))
}
case *float64:
if s.okVerb(verb, floatVerbs, "float64") {
- s.skipSpace()
+ s.skipSpace(false)
*v = s.convertFloat(s.floatToken(), 64)
}
case *string:
v.Elem(i).(*reflect.UintValue).Set(uint64(str[i]))
}
case *reflect.FloatValue:
- s.skipSpace()
+ s.skipSpace(false)
v.Set(s.convertFloat(s.floatToken(), v.Type().Bits()))
case *reflect.ComplexValue:
v.Set(s.scanComplex(verb, v.Type().Bits()))
// Space in format but not in input: error
s.errorString("expected space in input to match format")
}
- s.skipSpace()
+ s.skipSpace(true)
continue
}
inputc := s.mustGetRune()
// Custom scanner.
ScanfTest{"%s", " sss ", &xVal, Xs("sss")},
ScanfTest{"%2s", "sssss", &xVal, Xs("ss")},
+
+ // Fixed bugs
+ ScanfTest{"%d\n", "27\n", &intVal, 27}, // ok
+ ScanfTest{"%d\n", "28 \n", &intVal, 28}, // was: "unexpected newline"
}
var overflowTests = []ScanTest{