| // Copyright 2017 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Package query provides tools for parsing a query. | |
| package query | |
| // SplitWords splits q into words using shell syntax (whitespace | |
| // can be escaped with double quotes or with a backslash). | |
| func SplitWords(q string) []string { | |
| var words []string | |
| word := make([]byte, len(q)) | |
| w := 0 | |
| quoting := false | |
| for r := 0; r < len(q); r++ { | |
| switch c := q[r]; { | |
| case c == '"' && quoting: | |
| quoting = false | |
| case quoting: | |
| if c == '\\' { | |
| r++ | |
| } | |
| if r < len(q) { | |
| word[w] = q[r] | |
| w++ | |
| } | |
| case c == '"': | |
| quoting = true | |
| case c == ' ', c == '\t': | |
| if w > 0 { | |
| words = append(words, string(word[:w])) | |
| } | |
| w = 0 | |
| case c == '\\': | |
| r++ | |
| fallthrough | |
| default: | |
| if r < len(q) { | |
| word[w] = q[r] | |
| w++ | |
| } | |
| } | |
| } | |
| if w > 0 { | |
| words = append(words, string(word[:w])) | |
| } | |
| return words | |
| } |