mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
1.7 KiB
95 lines
1.7 KiB
8 years ago
|
package json
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
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
|
||
|
)
|
||
|
|
||
|
type Reader struct {
|
||
|
io.Reader
|
||
|
state State
|
||
|
}
|
||
|
|
||
|
func (v *Reader) Read(b []byte) (int, error) {
|
||
|
n, err := v.Reader.Read(b)
|
||
|
if err != nil {
|
||
|
return n, err
|
||
|
}
|
||
|
p := b[:0]
|
||
|
for _, x := range b[:n] {
|
||
|
switch v.state {
|
||
|
case StateContent:
|
||
|
switch x {
|
||
|
case '"':
|
||
|
v.state = StateDoubleQuote
|
||
|
p = append(p, x)
|
||
|
case '\'':
|
||
|
v.state = StateSingleQuote
|
||
|
p = append(p, x)
|
||
|
case '\\':
|
||
|
v.state = StateEscape
|
||
|
case '#':
|
||
|
v.state = StateComment
|
||
|
case '/':
|
||
|
v.state = StateSlash
|
||
|
default:
|
||
|
p = append(p, x)
|
||
|
}
|
||
|
case StateEscape:
|
||
|
p = append(p, x)
|
||
|
v.state = StateContent
|
||
|
case StateDoubleQuote:
|
||
|
if x == '"' {
|
||
|
v.state = StateContent
|
||
|
}
|
||
|
p = append(p, x)
|
||
|
case StateSingleQuote:
|
||
|
if x == '\'' {
|
||
|
v.state = StateContent
|
||
|
}
|
||
|
p = append(p, x)
|
||
|
case StateComment:
|
||
|
if x == '\n' {
|
||
|
v.state = StateContent
|
||
|
}
|
||
|
case StateSlash:
|
||
|
switch x {
|
||
|
case '/':
|
||
|
v.state = StateComment
|
||
|
case '*':
|
||
|
v.state = StateMultilineComment
|
||
|
default:
|
||
|
p = append(p, '/', x)
|
||
|
}
|
||
|
case StateMultilineComment:
|
||
|
if x == '*' {
|
||
|
v.state = StateMultilineCommentStar
|
||
|
}
|
||
|
case StateMultilineCommentStar:
|
||
|
switch x {
|
||
|
case '/':
|
||
|
v.state = StateContent
|
||
|
case '*':
|
||
|
// Stay
|
||
|
default:
|
||
|
v.state = StateMultilineComment
|
||
|
}
|
||
|
default:
|
||
|
panic("Unknown state.")
|
||
|
}
|
||
|
}
|
||
|
return len(p), nil
|
||
|
}
|