Darien Raymond 9 år sedan
förälder
incheckning
49202930ff
2 ändrade filer med 31 tillägg och 12 borttagningar
  1. 30 12
      tools/conf/json/reader.go
  2. 1 0
      tools/conf/json/reader_test.go

+ 30 - 12
tools/conf/json/reader.go

@@ -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

+ 1 - 0
tools/conf/json/reader_test.go

@@ -32,6 +32,7 @@ text 2*/`, `
 text text 2*`},
 		{`"//"content`, `"//"content`},
 		{`abcd'//'abcd`, `abcd'//'abcd`},
+		{`"\""`, `"\""`},
 	}
 
 	for _, testCase := range data {