| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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
- }
|