The Ansi parser and their associated actions have been decoupled. Now parsing results in call backs to an interface which performs the appropriate actions depending on the environment. This improvement provides a functional Vi experience and the vttest no longer panics. This PR replaces docker/docker #13224 with the latest console updates. Signed-off-by: John Howard <jhoward@microsoft.com> Upstream-commit: c923774c41678e4044081a87ec5841173d9577e7 Component: engine
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
// +build windows
|
|
|
|
package windows
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
. "github.com/Azure/go-ansiterm"
|
|
. "github.com/Azure/go-ansiterm/winterm"
|
|
"github.com/Sirupsen/logrus"
|
|
)
|
|
|
|
var logger *logrus.Logger
|
|
|
|
// ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation.
|
|
type ansiWriter struct {
|
|
file *os.File
|
|
fd uintptr
|
|
infoReset *CONSOLE_SCREEN_BUFFER_INFO
|
|
command []byte
|
|
escapeSequence []byte
|
|
inAnsiSequence bool
|
|
parser *AnsiParser
|
|
}
|
|
|
|
func newAnsiWriter(nFile int) *ansiWriter {
|
|
logFile := ioutil.Discard
|
|
|
|
if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" {
|
|
logFile, _ = os.Create("ansiReaderWriter.log")
|
|
}
|
|
|
|
logger = &logrus.Logger{
|
|
Out: logFile,
|
|
Formatter: new(logrus.TextFormatter),
|
|
Level: logrus.DebugLevel,
|
|
}
|
|
|
|
file, fd := GetStdFile(nFile)
|
|
info, err := GetConsoleScreenBufferInfo(fd)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
parser := CreateParser("Ground", CreateWinEventHandler(fd, file))
|
|
logger.Infof("newAnsiWriter: parser %p", parser)
|
|
|
|
aw := &ansiWriter{
|
|
file: file,
|
|
fd: fd,
|
|
infoReset: info,
|
|
command: make([]byte, 0, ANSI_MAX_CMD_LENGTH),
|
|
escapeSequence: []byte(KEY_ESC_CSI),
|
|
parser: parser,
|
|
}
|
|
|
|
logger.Infof("newAnsiWriter: aw.parser %p", aw.parser)
|
|
logger.Infof("newAnsiWriter: %v", aw)
|
|
return aw
|
|
}
|
|
|
|
func (aw *ansiWriter) Fd() uintptr {
|
|
return aw.fd
|
|
}
|
|
|
|
// Write writes len(p) bytes from p to the underlying data stream.
|
|
func (aw *ansiWriter) Write(p []byte) (total int, err error) {
|
|
if len(p) == 0 {
|
|
return 0, nil
|
|
}
|
|
|
|
logger.Infof("Write: % x", p)
|
|
logger.Infof("Write: %s", string(p))
|
|
return aw.parser.Parse(p)
|
|
}
|