@@ -55,6 +55,11 @@ type Reader interface {
5555 // reader.
5656 AdvanceAndSetPadding (int , int )
5757
58+ // AdvanceToEOL advances the internal pointer to the end of line.
59+ // If the line ends with a newline, it will be included in the segment.
60+ // If the line ends with EOF, it will not be included in the segment.
61+ AdvanceToEOL ()
62+
5863 // AdvanceLine advances the internal pointer to the next line head.
5964 AdvanceLine ()
6065
@@ -220,16 +225,44 @@ func (r *reader) AdvanceAndSetPadding(n, padding int) {
220225 }
221226}
222227
228+ func (r * reader ) AdvanceToEOL () {
229+ if r .pos .Start >= r .sourceLength {
230+ return
231+ }
232+
233+ r .lineOffset = - 1
234+ i := - 1
235+ if r .peekedLine != nil {
236+ r .pos .Start += len (r .peekedLine ) - r .pos .Padding - 1
237+ if r .source [r .pos .Start ] == '\n' {
238+ i = 0
239+ }
240+ }
241+ if i == - 1 {
242+ i = bytes .IndexByte (r .source [r .pos .Start :], '\n' )
243+ }
244+ r .peekedLine = nil
245+ if i != - 1 {
246+ r .pos .Start += i
247+ } else {
248+ r .pos .Start = r .sourceLength
249+ }
250+ r .pos .Padding = 0
251+ }
252+
223253func (r * reader ) AdvanceLine () {
224254 r .lineOffset = - 1
225255 r .peekedLine = nil
226256 r .pos .Start = r .pos .Stop
227257 r .head = r .pos .Start
228- if r .pos .Start < 0 {
258+ if r .pos .Start < 0 || r . pos . Start >= r . sourceLength {
229259 return
230260 }
231261 r .pos .Stop = r .sourceLength
232- i := bytes .IndexByte (r .source [r .pos .Start :], '\n' )
262+ i := 0
263+ if r .source [r .pos .Start ] != '\n' {
264+ i = bytes .IndexByte (r .source [r .pos .Start :], '\n' )
265+ }
233266 if i != - 1 {
234267 r .pos .Stop = r .pos .Start + i + 1
235268 }
@@ -441,6 +474,17 @@ func (r *blockReader) AdvanceAndSetPadding(n, padding int) {
441474 }
442475}
443476
477+ func (r * blockReader ) AdvanceToEOL () {
478+ r .lineOffset = - 1
479+ r .pos .Padding = 0
480+ c := r .source [r .pos .Stop - 1 ]
481+ if c == '\n' {
482+ r .pos .Start = r .pos .Stop - 1
483+ } else {
484+ r .pos .Start = r .pos .Stop
485+ }
486+ }
487+
444488func (r * blockReader ) AdvanceLine () {
445489 r .SetPosition (r .line + 1 , NewSegment (invalidValue , invalidValue ))
446490 r .head = r .pos .Start
0 commit comments