12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package ftp
- // A scanner for fields delimited by one or more whitespace characters
- type scanner struct {
- bytes []byte
- position int
- }
- // newScanner creates a new scanner
- func newScanner(str string) *scanner {
- return &scanner{
- bytes: []byte(str),
- }
- }
- // NextFields returns the next `count` fields
- func (s *scanner) NextFields(count int) []string {
- fields := make([]string, 0, count)
- for i := 0; i < count; i++ {
- if field := s.Next(); field != "" {
- fields = append(fields, field)
- } else {
- break
- }
- }
- return fields
- }
- // Next returns the next field
- func (s *scanner) Next() string {
- sLen := len(s.bytes)
- // skip trailing whitespace
- for s.position < sLen {
- if s.bytes[s.position] != ' ' {
- break
- }
- s.position++
- }
- start := s.position
- // skip non-whitespace
- for s.position < sLen {
- if s.bytes[s.position] == ' ' {
- s.position++
- return string(s.bytes[start : s.position-1])
- }
- s.position++
- }
- return string(s.bytes[start:s.position])
- }
- // Remaining returns the remaining string
- func (s *scanner) Remaining() string {
- return string(s.bytes[s.position:len(s.bytes)])
- }
|