scan.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "bufio"
  4. "unicode"
  5. "unicode/utf8"
  6. )
  7. type scanProvider struct {
  8. isList bool
  9. text string
  10. list []string
  11. scanner *bufio.Scanner
  12. }
  13. func (ip *scanProvider) Scan() bool {
  14. if ip.isList {
  15. if len(ip.list) == 0 {
  16. return false
  17. }
  18. ip.text = ip.list[0]
  19. ip.list = ip.list[1:]
  20. return true
  21. }
  22. return ip.scanner.Scan()
  23. }
  24. func (ip *scanProvider) Text() string {
  25. if ip.isList {
  26. return ip.text
  27. }
  28. return ip.scanner.Text()
  29. }
  30. func splitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
  31. start := 0
  32. for start < len(data) {
  33. r, width := utf8.DecodeRune(data[start:])
  34. if r == '\n' {
  35. return start + width, data[start : start+width], nil
  36. }
  37. if !unicode.IsSpace(r) {
  38. break
  39. }
  40. start += width
  41. }
  42. for i := start; i < len(data); {
  43. r, width := utf8.DecodeRune(data[i:])
  44. if r == '\n' {
  45. return i, data[start:i], nil
  46. }
  47. if unicode.IsSpace(r) {
  48. return i + width, data[start:i], nil
  49. }
  50. i += width
  51. }
  52. if atEOF && len(data) > start {
  53. return len(data), data[start:], nil
  54. }
  55. return start, nil, nil
  56. }