Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import "bytes"
- // dropCR drops a terminal \r from the data.
- func dropCR(data []byte) []byte {
- if len(data) > 0 && data[len(data)-1] == '\r' {
- return data[0 : len(data)-1]
- }
- return data
- }
- func ScanLineEndings(data []byte, atEOF bool) (advance int, token []byte, err error) {
- if atEOF && len(data) == 0 {
- return 0, nil, nil
- }
- if i := bytes.Index(data, []byte{'\r', '\n'}); i >= 0 {
- // We have a full newline-terminated line.
- return i + 2, dropCR(data[0:i]), nil
- }
- if i := bytes.IndexByte(data, '\r'); i >= 0 {
- // We have a full newline-terminated line.
- return i + 1, dropCR(data[0:i]), nil
- }
- if i := bytes.IndexByte(data, '\n'); i >= 0 {
- // We have a full newline-terminated line.
- return i + 1, dropCR(data[0:i]), nil
- }
- // If we're at EOF, we have a final, non-terminated line. Return it.
- if atEOF {
- return len(data), dropCR(data), nil
- }
- // Request more data.
- return 0, nil, nil
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement