Skip to content

Commit a1d69c6

Browse files
committed
save/restore part of buffers
1 parent 6df6d4d commit a1d69c6

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

colorable_windows.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type Writer struct {
8888
althandle syscall.Handle
8989
oldattr word
9090
oldpos coord
91+
rest bytes.Buffer
9192
}
9293

9394
// NewColorable return new instance of Writer which handle escape sequence from File.
@@ -419,7 +420,17 @@ func (w *Writer) Write(data []byte) (n int, err error) {
419420
procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
420421

421422
handle := w.handle
422-
er := bytes.NewReader(data)
423+
424+
var er *bytes.Reader
425+
if w.rest.Len() > 0 {
426+
var rest bytes.Buffer
427+
w.rest.WriteTo(&rest)
428+
w.rest.Reset()
429+
rest.Write(data)
430+
er = bytes.NewReader(rest.Bytes())
431+
} else {
432+
er = bytes.NewReader(data)
433+
}
423434
var bw [1]byte
424435
loop:
425436
for {
@@ -438,28 +449,42 @@ loop:
438449
}
439450

440451
if c2 == ']' {
441-
if err := doTitleSequence(er); err != nil {
452+
w.rest.WriteByte(c1)
453+
w.rest.WriteByte(c2)
454+
er.WriteTo(&w.rest)
455+
if bytes.IndexByte(w.rest.Bytes(), 0x07) == -1 {
456+
break loop
457+
}
458+
er = bytes.NewReader(w.rest.Bytes()[2:])
459+
err := doTitleSequence(er)
460+
if err != nil {
442461
break loop
443462
}
463+
w.rest.Reset()
444464
continue
445465
}
446466
if c2 != 0x5b {
447467
continue
448468
}
449469

470+
w.rest.WriteByte(c1)
471+
w.rest.WriteByte(c2)
472+
er.WriteTo(&w.rest)
473+
450474
var buf bytes.Buffer
451475
var m byte
452-
for {
453-
c, err := er.ReadByte()
454-
if err != nil {
455-
break loop
456-
}
476+
for i, c := range w.rest.Bytes()[2:] {
457477
if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
458478
m = c
479+
er = bytes.NewReader(w.rest.Bytes()[2+i+1:])
480+
w.rest.Reset()
459481
break
460482
}
461483
buf.Write([]byte(string(c)))
462484
}
485+
if m == 0 {
486+
break loop
487+
}
463488

464489
switch m {
465490
case 'A':

0 commit comments

Comments
 (0)