|
|
@@ -7,14 +7,16 @@ import (
|
|
|
type State byte
|
|
|
|
|
|
const (
|
|
|
- StateContent State = 0
|
|
|
- StateEscape State = 1
|
|
|
- StateDoubleQuote State = 2
|
|
|
- StateSingleQuote State = 3
|
|
|
- StateComment State = 4
|
|
|
- StateSlash State = 5
|
|
|
- StateMultilineComment State = 6
|
|
|
- StateMultilineCommentStar State = 7
|
|
|
+ StateContent State = iota
|
|
|
+ StateEscape
|
|
|
+ StateDoubleQuote
|
|
|
+ StateDoubleQuoteEscape
|
|
|
+ StateSingleQuote
|
|
|
+ StateSingleQuoteEscape
|
|
|
+ StateComment
|
|
|
+ StateSlash
|
|
|
+ StateMultilineComment
|
|
|
+ StateMultilineCommentStar
|
|
|
)
|
|
|
|
|
|
type Reader struct {
|
|
|
@@ -51,15 +53,31 @@ func (v *Reader) Read(b []byte) (int, error) {
|
|
|
p = append(p, x)
|
|
|
v.state = StateContent
|
|
|
case StateDoubleQuote:
|
|
|
- if x == '"' {
|
|
|
+ switch x {
|
|
|
+ case '"':
|
|
|
v.state = StateContent
|
|
|
+ p = append(p, x)
|
|
|
+ case '\\':
|
|
|
+ v.state = StateDoubleQuoteEscape
|
|
|
+ default:
|
|
|
+ p = append(p, x)
|
|
|
}
|
|
|
- p = append(p, x)
|
|
|
+ case StateDoubleQuoteEscape:
|
|
|
+ p = append(p, '\\', x)
|
|
|
+ v.state = StateDoubleQuote
|
|
|
case StateSingleQuote:
|
|
|
- if x == '\'' {
|
|
|
+ switch x {
|
|
|
+ case '\'':
|
|
|
v.state = StateContent
|
|
|
+ p = append(p, x)
|
|
|
+ case '\\':
|
|
|
+ v.state = StateSingleQuoteEscape
|
|
|
+ default:
|
|
|
+ p = append(p, x)
|
|
|
}
|
|
|
- p = append(p, x)
|
|
|
+ case StateSingleQuoteEscape:
|
|
|
+ p = append(p, '\\', x)
|
|
|
+ v.state = StateSingleQuote
|
|
|
case StateComment:
|
|
|
if x == '\n' {
|
|
|
v.state = StateContent
|