From b83823283da894a8aaea8c1a905848861952aa02 Mon Sep 17 00:00:00 2001 From: Matrix86 Date: Fri, 16 Feb 2018 18:31:56 +0100 Subject: [PATCH] Fix #54: cmd parsing improved. It is possible set multiple command on ticker.commands with single or double quote. --- session/session.go | 57 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/session/session.go b/session/session.go index ec3025ca..47572903 100644 --- a/session/session.go +++ b/session/session.go @@ -52,14 +52,67 @@ type Session struct { Events *EventPool `json:"-"` } -func ParseCommands(buffer string) []string { +func ParseCommands(line string) []string { + args := []string{} + buf := "" + + singleQuoted := false + doubleQuoted := false + finish := false + + for _, c := range line { + switch c { + case ';': + if singleQuoted == false && doubleQuoted == false { + finish = true + } else { + buf += string(c) + } + + case '"': + if doubleQuoted { + // finish of quote + doubleQuoted = false + } else if singleQuoted { + // quote initiated with ', so we ignore it + buf += string(c) + } else { + // quote init here + doubleQuoted = true + } + + case '\'': + if singleQuoted { + singleQuoted = false + } else if doubleQuoted { + buf += string(c) + } else { + singleQuoted = true + } + + default: + buf += string(c) + } + + if finish { + args = append(args, buf) + finish = false + buf = "" + } + } + + if len(buf) > 0 { + args = append(args, buf) + } + cmds := make([]string, 0) - for _, cmd := range strings.Split(buffer, ";") { + for _, cmd := range args { cmd = core.Trim(cmd) if cmd != "" || (len(cmd) > 0 && cmd[0] != '#') { cmds = append(cmds, cmd) } } + return cmds }