]> Cypherpunks repositories - gostls13.git/commitdiff
exp/terminal: add SetPrompt and handle large pastes.
authorAdam Langley <agl@golang.org>
Sat, 14 Jan 2012 15:59:11 +0000 (10:59 -0500)
committerAdam Langley <agl@golang.org>
Sat, 14 Jan 2012 15:59:11 +0000 (10:59 -0500)
(This was missing in the last change because I uploaded it from the
wrong machine.)

Large pastes previously misbehaved because the code tried reading from
the terminal before checking whether an line was already buffered.
Large pastes can cause multiples lines to be read at once from the
terminal.

R=bradfitz
CC=golang-dev
https://golang.org/cl/5542049

src/pkg/exp/terminal/terminal.go

index 809e88cacfa3f448a391ca857ec18a10fef7733c..5fd862e59517f58c610c590498ee8158c01a59c0 100644 (file)
@@ -463,6 +463,31 @@ func (t *Terminal) readLine() (line string, err error) {
        }
 
        for {
+               rest := t.remainder
+               lineOk := false
+               for !lineOk {
+                       var key int
+                       key, rest = bytesToKey(rest)
+                       if key < 0 {
+                               break
+                       }
+                       if key == keyCtrlD {
+                               return "", io.EOF
+                       }
+                       line, lineOk = t.handleKey(key)
+               }
+               if len(rest) > 0 {
+                       n := copy(t.inBuf[:], rest)
+                       t.remainder = t.inBuf[:n]
+               } else {
+                       t.remainder = nil
+               }
+               t.c.Write(t.outBuf)
+               t.outBuf = t.outBuf[:0]
+               if lineOk {
+                       return
+               }
+
                // t.remainder is a slice at the beginning of t.inBuf
                // containing a partial key sequence
                readBuf := t.inBuf[len(t.remainder):]
@@ -476,38 +501,19 @@ func (t *Terminal) readLine() (line string, err error) {
                        return
                }
 
-               if err == nil {
-                       t.remainder = t.inBuf[:n+len(t.remainder)]
-                       rest := t.remainder
-                       lineOk := false
-                       for !lineOk {
-                               var key int
-                               key, rest = bytesToKey(rest)
-                               if key < 0 {
-                                       break
-                               }
-                               if key == keyCtrlD {
-                                       return "", io.EOF
-                               }
-                               line, lineOk = t.handleKey(key)
-                       }
-                       if len(rest) > 0 {
-                               n := copy(t.inBuf[:], rest)
-                               t.remainder = t.inBuf[:n]
-                       } else {
-                               t.remainder = nil
-                       }
-                       t.c.Write(t.outBuf)
-                       t.outBuf = t.outBuf[:0]
-                       if lineOk {
-                               return
-                       }
-                       continue
-               }
+               t.remainder = t.inBuf[:n+len(t.remainder)]
        }
        panic("unreachable")
 }
 
+// SetPrompt sets the prompt to be used when reading subsequent lines.
+func (t *Terminal) SetPrompt(prompt string) {
+       t.lock.Lock()
+       defer t.lock.Unlock()
+
+       t.prompt = prompt
+}
+
 func (t *Terminal) SetSize(width, height int) {
        t.lock.Lock()
        defer t.lock.Unlock()