1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package plugin_manager
- import (
- "bytes"
- "errors"
- "github.com/panjf2000/gnet/v2"
- )
- type codec struct {
- buf bytes.Buffer
- }
- func (w *codec) Decode(c gnet.Conn) ([][]byte, error) {
- size := c.InboundBuffered()
- buf := make([]byte, size)
- read, err := c.Read(buf)
- if err != nil {
- return nil, err
- }
- if read < size {
- return nil, errors.New("read less than size")
- }
- // use \ as escape character, as for \ itself, it should be escaped as well
- var start int
- var result [][]byte = make([][]byte, 0)
- var current_line []byte = make([]byte, 0)
- for i := 0; i < size; i++ {
- if buf[i] == '\\' {
- // write to current line
- current_line = append(current_line, buf[start:i]...)
- start = i + 1
- i++
- continue
- }
- if buf[i] == '\n' {
- // write to current line
- current_line = append(current_line, buf[start:i]...)
- result = append(result, current_line)
- current_line = make([]byte, 0)
- start = i + 1
- }
- }
- // for the last line, write it to buffer
- if start < size {
- w.buf.Write(buf[start:size])
- }
- return result, nil
- }
|