From 857efdf601798cf4b9399ce713d46cf1551b6e6c Mon Sep 17 00:00:00 2001 From: Charles Iliya Krempeaux Date: Sun, 13 Nov 2022 20:55:41 -0800 Subject: [PATCH] initial commits --- copyline.go | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 copyline.go diff --git a/copyline.go b/copyline.go new file mode 100644 index 0000000..2d7e62f --- /dev/null +++ b/copyline.go @@ -0,0 +1,117 @@ +package netln + +import ( + "errors" + "io" +) + +// CopyLine reads in a line from ‘reader’ and writes that line to ‘writer’ (without the line terminator). +// +// For CopyLine, a line is terminated by the "\r\n" characters. +// +// So, for example, if from ‘reader’ CopyLine read in: +// +// "Hello world!\r\n" +// +// Then what CopyLine would write to ‘writer’ is: +// +// "Hello world!" +// +// (Notice that the "\r\n" at the end is missing.) +// +// Note that ‘n64’ represents how many bytes were written, not read. +func CopyLine(writer io.Writer, reader io.Reader) (n64 int64, err error) { + + for { + var eof bool + + var r0 rune + var size0 int + { + r0, size0, err = readRune(reader) + eof = errors.Is(err, io.EOF) + if nil != err && !eof { +/////////////////////////////// RETURN + return + } + } + + if size0 <= 0 { + /////////////// BREAK + break + } + + if '\r' != r0 || eof { + + err = writeRune(writer, r0, size0) + if nil != err { +/////////////////////////////// RETURN + return + } + n64 += int64(size0) + + if eof { + /////////////////////// BREAK + break + } else { + /////////////////////// CONTINUE + continue + } + } + + var r1 rune + var size1 int + { + r1, size1, err = readRune(reader) + eof = errors.Is(err, io.EOF) + if nil != err && !eof { +/////////////////////////////// RETURN + return + } + } + + if size1 <= 0 { + err = writeRune(writer, r0, size0) + if nil != err { +/////////////////////////////// RETURN + return + } + n64 += int64(size0) + /////////////// BREAK + break + } + + if '\n' != r1 { + { + err = writeRune(writer, r0, size0) + if nil != err { +/////////////////////////////////////// RETURN + return + } + n64 += int64(size0) + } + + { + err = writeRune(writer, r1, size1) + if nil != err { +/////////////////////////////////////// RETURN + return + } + n64 += int64(size1) + } + + if eof { +/////////////////////////////// BREAK + break + } else { +/////////////////////////////// CONTINUE + continue + } + } + + /////// BREAK + break + } + + return n64, nil +}