aboutsummaryrefslogtreecommitdiffstats
path: root/common/args/args.go
diff options
context:
space:
mode:
Diffstat (limited to 'common/args/args.go')
-rw-r--r--common/args/args.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/common/args/args.go b/common/args/args.go
new file mode 100644
index 0000000..28c3b5f
--- /dev/null
+++ b/common/args/args.go
@@ -0,0 +1,79 @@
+package args
+
+import (
+ "strings"
+
+ "github.com/osm/quake/common/buffer"
+)
+
+type Arg struct {
+ Cmd string
+ Args []string
+}
+
+func Parse(input string) []Arg {
+ var arg string
+ var args []string
+ var ret []Arg
+ var inQuotes bool
+
+ for _, c := range input {
+ switch c {
+ case '\n', ';':
+ if inQuotes {
+ arg += string(c)
+ continue
+ }
+
+ if arg != "" {
+ args = append(args, strings.TrimSpace(arg))
+ }
+
+ ret = append(ret, Arg{Cmd: strings.TrimSpace(args[0]), Args: args[1:]})
+ arg = ""
+ args = []string{}
+ case ' ':
+ if inQuotes {
+ arg += string(c)
+ continue
+ }
+
+ if arg != "" {
+ args = append(args, strings.TrimSpace(arg))
+ arg = ""
+ }
+ case '"':
+ inQuotes = !inQuotes
+ arg += string(c)
+ default:
+ arg += string(c)
+ }
+ }
+
+ if arg != "" {
+ args = append(args, strings.TrimSpace(arg))
+ }
+
+ if len(args) > 0 {
+ ret = append(ret, Arg{Cmd: strings.TrimSpace(args[0]), Args: args[1:]})
+ }
+
+ return ret
+}
+
+func (s Arg) Bytes() []byte {
+ buf := buffer.New()
+
+ buf.PutBytes([]byte(s.Cmd))
+
+ if len(s.Args) > 0 {
+ buf.PutByte(byte(' '))
+ buf.PutBytes([]byte(strings.Join(s.Args, " ")))
+ }
+
+ return buf.Bytes()
+}
+
+func (s Arg) String() string {
+ return string(s.Bytes())
+}