Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.91 KB | None | 0 0
  1. package main
  2.  
  3. import "bytes"
  4.  
  5. // dropCR drops a terminal \r from the data.
  6. func dropCR(data []byte) []byte {
  7. if len(data) > 0 && data[len(data)-1] == '\r' {
  8. return data[0 : len(data)-1]
  9. }
  10. return data
  11. }
  12.  
  13. func ScanLineEndings(data []byte, atEOF bool) (advance int, token []byte, err error) {
  14. if atEOF && len(data) == 0 {
  15. return 0, nil, nil
  16. }
  17.  
  18. if i := bytes.Index(data, []byte{'\r', '\n'}); i >= 0 {
  19. // We have a full newline-terminated line.
  20. return i + 2, dropCR(data[0:i]), nil
  21. }
  22. if i := bytes.IndexByte(data, '\r'); i >= 0 {
  23. // We have a full newline-terminated line.
  24. return i + 1, dropCR(data[0:i]), nil
  25. }
  26. if i := bytes.IndexByte(data, '\n'); i >= 0 {
  27. // We have a full newline-terminated line.
  28. return i + 1, dropCR(data[0:i]), nil
  29. }
  30. // If we're at EOF, we have a final, non-terminated line. Return it.
  31. if atEOF {
  32. return len(data), dropCR(data), nil
  33. }
  34. // Request more data.
  35. return 0, nil, nil
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement