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