initial commits
parent
5a9076dd18
commit
857efdf601
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue