forked from couchbaselabs/gojsonsm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fastlitparse.go
87 lines (72 loc) · 1.71 KB
/
fastlitparse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright 2018 Couchbase, Inc. All rights reserved.
package gojsonsm
import (
"strconv"
)
type fastLitParser struct {
tmpInt int64
tmpNum float64
tmpBool bool
tmpBytes []byte
tmpBytesData [64]byte
}
func (p *fastLitParser) ParseInt(bytes []byte) int64 {
var v int64
if len(bytes) == 0 {
return 0
}
var neg bool = false
if bytes[0] == '-' {
neg = true
bytes = bytes[1:]
}
for _, c := range bytes {
if c >= '0' && c <= '9' {
v = (10 * v) + int64(c-'0')
} else {
return 0
}
}
if neg {
return -v
} else {
return v
}
}
func (p *fastLitParser) ParseNumber(bytes []byte) float64 {
val, _ := strconv.ParseFloat(string(bytes), 64)
return val
}
func (p *fastLitParser) ParseString(bytes []byte) []byte {
return bytes[1 : len(bytes)-1]
}
func (p *fastLitParser) ParseStringWLen(bytes []byte, size int) []byte {
return bytes[1 : size-1]
}
func (p *fastLitParser) ParseEscString(bytes []byte) []byte {
bytesOut, _ := unescapeJsonString(bytes[1:len(bytes)-1], p.tmpBytesData[:])
return bytesOut
}
func (p *fastLitParser) ParseEscStringWLen(bytes []byte, size int) []byte {
bytesOut, _ := unescapeJsonString(bytes[1:size-1], p.tmpBytesData[:])
return bytesOut
}
func (p *fastLitParser) Parse(token tokenType, bytes []byte) FastVal {
switch token {
case tknString:
return NewBinStringFastVal(p.ParseString(bytes))
case tknEscString:
return NewBinStringFastVal(p.ParseEscString(bytes))
case tknInteger:
return NewIntFastVal(p.ParseInt(bytes))
case tknNumber:
return NewFloatFastVal(p.ParseNumber(bytes))
case tknNull:
return NewNullFastVal()
case tknTrue:
return NewBoolFastVal(true)
case tknFalse:
return NewBoolFastVal(false)
}
panic("invalid token")
}