From f59e1b1f8403216d435e4904550eb6c2844ce690 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 6 Jun 2019 15:59:49 -0700 Subject: [PATCH] add perl 'chomp'. too lazy to make it correct with regex Signed-off-by: Jeff Carr --- chomp.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ shell.go | 6 ++--- 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 chomp.go diff --git a/chomp.go b/chomp.go new file mode 100644 index 0000000..b452ff2 --- /dev/null +++ b/chomp.go @@ -0,0 +1,73 @@ +package shell + +/* + perl 'chomp' + + send it anything, always get back a string +*/ + +import "log" +import "reflect" +import "strings" +import "bytes" + +// import "github.com/davecgh/go-spew/spew" + +func chompBytesBuffer(buf *bytes.Buffer) string { + var bytesSplice []byte + bytesSplice = buf.Bytes() + + return Chomp(string(bytesSplice)) +} + +// +// TODO: obviously this is stupidly wrong +// TODO: fix this to trim fucking everything +// really world? 8 fucking years of this language +// and I'm fucking writing this? jesus. how the +// hell is everyone else doing this? Why isn't +// this already in the strings package? +// +func perlChomp(s string) string { + // lots of stuff in go moves around the whole block of whatever it is so lots of things are padded with NULL values + s = strings.Trim(s, "\x00") // removes NULL (needed!) + + // TODO: christ. make some fucking regex that takes out every NULL, \t, ' ", \n, and \r + s = strings.Trim(s, "\n") + s = strings.Trim(s, "\n") + s = strings.TrimSuffix(s, "\r") + s = strings.TrimSuffix(s, "\n") + + s = strings.TrimSpace(s) // this is like 'chomp' in perl + s = strings.TrimSuffix(s, "\n") // this is like 'chomp' in perl + return s +} + +// TODO: fix this to chomp \n \r NULL \t and ' ' +func Chomp(a interface{}) string { + // switch reflect.TypeOf(a) { + switch t := a.(type) { + case string: + var s string + s = a.(string) + return perlChomp(s) + case []uint8: + log.Printf("shell.Chomp() FOUND []uint8") + var u8s []uint8 + u8s = a.([]uint8) + + s := string(u8s) + return perlChomp(s) + case *bytes.Buffer: + log.Printf("shell.Chomp() FOUND *bytes.Buffer") + var tmp *bytes.Buffer + tmp = a.(*bytes.Buffer) + + var bytesSplice []byte + bytesSplice = tmp.Bytes() + return Chomp(string(bytesSplice)) + default: + log.Printf("shell.Chomp() NEED TO MAKE CONVERTER FOR type =", reflect.TypeOf(t)) + } + return "" +} diff --git a/shell.go b/shell.go index aaad099..ddc9a1f 100644 --- a/shell.go +++ b/shell.go @@ -44,7 +44,7 @@ func Script(cmds string) int { lines := strings.Split(strings.Replace(cmds, "\r\n", "\n", -1), "\n") for _, line := range lines { - line = strings.TrimSpace(line) // this is like 'chomp' in perl + line = Chomp(line) // this is like 'chomp' in perl log.Println("LINE:", line) time.Sleep(1) Run(line) @@ -79,7 +79,7 @@ func SetStderr(newerr *os.File) { func Run(cmdline string) string { log.Println("shell.Run() START " + cmdline) - cmd := strings.TrimSpace(cmdline) // this is like 'chomp' in perl + cmd := Chomp(cmdline) // this is like 'chomp' in perl cmdArgs := strings.Fields(cmd) if (len(cmdArgs) == 0) { callback(fmt.Errorf("cmdline == ''"), 0) @@ -191,7 +191,7 @@ func Run(cmdline string) string { log.Println("shell.Run() END ", cmdline) log.Println("shell.Run() calling callback() :") callback(fmt.Errorf("no error"), 0) - return string(b) + return Chomp(b) } func Daemon(cmdline string, timeout time.Duration) int {