devtools/madb: use textutil.PrefixLineWriter

Now prefixer internally uses textutil.PrefixLineWriter instead.
Also switched the argument order to be consistent with PrefixLineWriter.

Change-Id: I05b824b87e96f1d2312e81ec31fe023fffddf6bc
diff --git a/exec.go b/exec.go
index 3866328..2aafef3 100644
--- a/exec.go
+++ b/exec.go
@@ -71,8 +71,8 @@
 	cmdArgs := append([]string{"-s", device}, args...)
 	cmd := sh.Cmd("adb", cmdArgs...)
 
-	cmd.AddStdoutWriter(newPrefixer(device, os.Stdout))
-	cmd.AddStderrWriter(newPrefixer(device, os.Stderr))
+	cmd.AddStdoutWriter(newPrefixer(os.Stdout, device))
+	cmd.AddStderrWriter(newPrefixer(os.Stderr, device))
 	cmd.Run()
 
 	return sh.Err
diff --git a/prefixer.go b/prefixer.go
index a67fdf5..ed2c573 100644
--- a/prefixer.go
+++ b/prefixer.go
@@ -5,65 +5,26 @@
 package main
 
 import (
-	"bytes"
+	"fmt"
 	"io"
-	"os"
+
+	"v.io/x/lib/textutil"
 )
 
 // prefixer is a io.WriteCloser that adds given prefix to each line of the output.
 type prefixer struct {
-	prefix []byte
-	writer io.Writer
-	buffer bytes.Buffer
+	textutil.WriteFlusher
 }
 
 // newPrefixer returns a new prefixer that uses the given prefix.
-func newPrefixer(prefix string, writer io.Writer) *prefixer {
+func newPrefixer(writer io.Writer, prefix string) *prefixer {
 	return &prefixer{
-		prefix: []byte("[" + prefix + "]\t"),
-		writer: writer,
-		buffer: bytes.Buffer{},
+		WriteFlusher: textutil.PrefixLineWriter(writer, fmt.Sprintf("[%v]\t", prefix)),
 	}
 }
 
-func (p *prefixer) Write(b []byte) (int, error) {
-	// write the bytes to the buffer.
-	p.buffer.Write(b)
-
-	// For each line in the unread buffer, add the prefix and write it to the underlying writer.
-	for {
-		idx := bytes.IndexByte(p.buffer.Bytes(), '\n')
-		if idx == -1 {
-			break
-		}
-
-		prefixed := append(p.prefix, p.buffer.Next(idx+1)...)
-		if _, err := p.writer.Write(prefixed); err != nil {
-			return len(b), err
-		}
-	}
-
-	return len(b), nil
-}
-
 // Close flushes the remaining buffer content with prefix, and closes the underlying writer if applicable.
+// This internally calls Flush() on the underlying textutil.WriteFlusher.
 func (p *prefixer) Close() error {
-	// Flush the remaining buffer content if any.
-	// Add the prefix at the beginning, and a newline character at the end.
-	if p.buffer.Len() > 0 {
-		prefixed := append(p.prefix, p.buffer.Bytes()...)
-		prefixed = append(prefixed, '\n')
-		if _, err := p.writer.Write(prefixed); err != nil {
-			return err
-		}
-	}
-
-	// Close the underlying writer unless the writer is stdout or stderr.
-	if p.writer != os.Stdout && p.writer != os.Stderr {
-		if closer, ok := p.writer.(io.Closer); ok {
-			return closer.Close()
-		}
-	}
-
-	return nil
+	return p.WriteFlusher.Flush()
 }
diff --git a/prefixer_test.go b/prefixer_test.go
index 9a78c86..63e1332 100644
--- a/prefixer_test.go
+++ b/prefixer_test.go
@@ -12,7 +12,7 @@
 
 func TestPrefixerSingleDevice(t *testing.T) {
 	buffer := bytes.Buffer{}
-	prefixer := newPrefixer("deviceid01", &buffer)
+	prefixer := newPrefixer(&buffer, "deviceid01")
 
 	fmt.Fprintln(prefixer, "First line.")
 	fmt.Fprintln(prefixer, "Second line.")
@@ -30,8 +30,8 @@
 func TestPrefixerTwoDevices(t *testing.T) {
 	// Two devices case
 	buffer := bytes.Buffer{}
-	prefixer1 := newPrefixer("deviceid01", &buffer)
-	prefixer2 := newPrefixer("deviceid02", &buffer)
+	prefixer1 := newPrefixer(&buffer, "deviceid01")
+	prefixer2 := newPrefixer(&buffer, "deviceid02")
 
 	fmt.Fprintf(prefixer2, "Second")
 	fmt.Fprintln(prefixer1, "First line.")
@@ -55,7 +55,7 @@
 func TestPrefixerLastLine(t *testing.T) {
 	// For the last line, a newline character should be added automatically.
 	buffer := bytes.Buffer{}
-	prefixer := newPrefixer("deviceid01", &buffer)
+	prefixer := newPrefixer(&buffer, "deviceid01")
 
 	fmt.Fprintf(prefixer, "First line.")
 	prefixer.Close()