ascii to str

This commit is contained in:
llaoj 2022-11-14 12:15:16 +08:00
parent 70a264ed00
commit 8a7fa9ecb9
2 changed files with 63 additions and 16 deletions

View File

@ -1,7 +1,35 @@
package utils package utils
func FormatWritesLog(line *[]byte) (log string) { import "fmt"
ascii := map[byte]string{
func FormatWritesLog(codes []byte, line *string) {
n := len(codes)
str := ""
exist := false
if n == 3 {
if str, exist = ASCIIGroupToStr(fmt.Sprintf("%X", codes)); exist {
*line += str
codes = nil
}
}
// sh line prefix
if n >= 6 {
if str, exist = ASCIIGroupToStr(fmt.Sprintf("%X", []byte{codes[0], codes[1], codes[n-1]})); exist {
*line += str
codes = nil
}
}
if codes != nil {
str = ASCIIToStr(codes)
*line += str
}
return
}
func ASCIIToStr(codes []byte) string {
control := map[byte]string{
0: "NUL", 0: "NUL",
1: "SOH", 1: "SOH",
2: "STX", 2: "STX",
@ -36,13 +64,32 @@ func FormatWritesLog(line *[]byte) (log string) {
31: "US", 31: "US",
127: "DEL", 127: "DEL",
} }
for _, word := range *line {
if value, ok := ascii[word]; ok { str := ""
log += value for _, code := range codes {
continue if value, ok := control[code]; ok {
str += value
} else {
str += string(code)
}
} }
log += string(word) return str
} }
return
func ASCIIGroupToStr(sum string) (string, bool) {
group := map[string]string{
"1B5B41": "UP",
"1B5B42": "DOWN",
"1B5B43": "RIGHT",
"1B5B44": "LEFT",
// sh line prefix: codes[0]codes[1]codes[5]
// eg. "ESC[ 1;5 R"
"1B5B52": "",
}
if value, ok := group[sum]; ok {
return value, true
}
return "", false
} }

View File

@ -91,14 +91,14 @@ func (wt *WebTTY) Run(ctx context.Context) error {
go func() { go func() {
errs <- func() error { errs <- func() error {
buffer := make([]byte, wt.bufferSize) buffer := make([]byte, wt.bufferSize)
lineBuffer := make([]byte, 1) line := ""
for { for {
n, err := wt.masterConn.Read(buffer) n, err := wt.masterConn.Read(buffer)
if err != nil { if err != nil {
return ErrMasterClosed return ErrMasterClosed
} }
err = wt.handleMasterReadEvent(buffer[:n], &lineBuffer) err = wt.handleMasterReadEvent(buffer[:n], &line)
if err != nil { if err != nil {
return err return err
} }
@ -167,7 +167,7 @@ func (wt *WebTTY) masterWrite(data []byte) error {
return nil return nil
} }
func (wt *WebTTY) handleMasterReadEvent(data []byte, line *[]byte) error { func (wt *WebTTY) handleMasterReadEvent(data []byte, line *string) error {
if len(data) == 0 { if len(data) == 0 {
return errors.New("unexpected zero length read from master") return errors.New("unexpected zero length read from master")
} }
@ -188,15 +188,15 @@ func (wt *WebTTY) handleMasterReadEvent(data []byte, line *[]byte) error {
return errors.Wrapf(err, "failed to decode received data") return errors.Wrapf(err, "failed to decode received data")
} }
*line = append(*line, decodedBuffer[:n]...) // log.Printf("[wlog] %v %X\n", decodedBuffer[:n], decodedBuffer[:n])
utils.FormatWritesLog(decodedBuffer[:n], line)
if decodedBuffer[n-1] == 13 { if decodedBuffer[n-1] == 13 {
argumentsByte, err := json.Marshal(wt.arguments) argumentsByte, err := json.Marshal(wt.arguments)
if err != nil { if err != nil {
return errors.Wrapf(err, "failed to marshal arguments map") return errors.Wrapf(err, "failed to marshal arguments map")
} }
//log.Printf("[wlog] %v\n", line) log.Printf("[wlog] %s %s\n", *line, string(argumentsByte))
log.Printf("[wlog] %s %s\n", utils.FormatWritesLog(line), string(argumentsByte)) *line = ""
*line = nil
} }
_, err = wt.slave.Write(decodedBuffer[:n]) _, err = wt.slave.Write(decodedBuffer[:n])