(buf *bufio.Reader)
| 99 | } |
| 100 | |
| 101 | func (c *Config) parseBuffer(buf *bufio.Reader) error { |
| 102 | var section string |
| 103 | var lineNum int |
| 104 | var buffer bytes.Buffer |
| 105 | var canWrite bool |
| 106 | for { |
| 107 | if canWrite { |
| 108 | if err := c.write(section, lineNum, &buffer); err != nil { |
| 109 | return err |
| 110 | } else { |
| 111 | canWrite = false |
| 112 | } |
| 113 | } |
| 114 | lineNum++ |
| 115 | line, _, err := buf.ReadLine() |
| 116 | if err == io.EOF { |
| 117 | // force write when buffer is not flushed yet |
| 118 | if buffer.Len() > 0 { |
| 119 | if err = c.write(section, lineNum, &buffer); err != nil { |
| 120 | return err |
| 121 | } |
| 122 | } |
| 123 | break |
| 124 | } else if err != nil { |
| 125 | return err |
| 126 | } |
| 127 | |
| 128 | line = bytes.TrimSpace(line) |
| 129 | switch { |
| 130 | case bytes.Equal(line, []byte{}), bytes.HasPrefix(line, DEFAULT_COMMENT_SEM), |
| 131 | bytes.HasPrefix(line, DEFAULT_COMMENT): |
| 132 | canWrite = true |
| 133 | continue |
| 134 | case bytes.HasPrefix(line, []byte{'['}) && bytes.HasSuffix(line, []byte{']'}): |
| 135 | // force write when buffer is not flushed yet |
| 136 | if buffer.Len() > 0 { |
| 137 | if err := c.write(section, lineNum, &buffer); err != nil { |
| 138 | return err |
| 139 | } |
| 140 | canWrite = false |
| 141 | } |
| 142 | section = string(line[1 : len(line)-1]) |
| 143 | default: |
| 144 | var p []byte |
| 145 | if bytes.HasSuffix(line, DEFAULT_MULTI_LINE_SEPARATOR) { |
| 146 | p = bytes.TrimSpace(line[:len(line)-1]) |
| 147 | p = append(p, " "...) |
| 148 | } else { |
| 149 | p = line |
| 150 | canWrite = true |
| 151 | } |
| 152 | |
| 153 | end := len(p) |
| 154 | for i, value := range p { |
| 155 | if value == DEFAULT_COMMENT[0] || value == DEFAULT_COMMENT_SEM[0] { |
| 156 | end = i |
| 157 | break |
| 158 | } |
no test coverage detected