...
1
16
17 package types
18
19 import (
20 `fmt`
21 `sync`
22 `unsafe`
23 )
24
25 type ValueType int
26 type ParsingError uint
27 type SearchingError uint
28
29
30
31
32 const (
33 V_EOF ValueType = 1
34 V_NULL ValueType = 2
35 V_TRUE ValueType = 3
36 V_FALSE ValueType = 4
37 V_ARRAY ValueType = 5
38 V_OBJECT ValueType = 6
39 V_STRING ValueType = 7
40 V_DOUBLE ValueType = 8
41 V_INTEGER ValueType = 9
42 _ ValueType = 10
43 _ ValueType = 11
44 _ ValueType = 12
45 _ ValueType = 13
46 V_MAX
47 )
48
49 const (
50
51 B_DOUBLE_UNQUOTE = 0
52 B_UNICODE_REPLACE = 1
53
54
55 B_USE_NUMBER = 1
56 B_VALIDATE_STRING = 5
57 B_ALLOW_CONTROL = 31
58 )
59
60 const (
61 F_DOUBLE_UNQUOTE = 1 << B_DOUBLE_UNQUOTE
62 F_UNICODE_REPLACE = 1 << B_UNICODE_REPLACE
63
64 F_USE_NUMBER = 1 << B_USE_NUMBER
65 F_VALIDATE_STRING = 1 << B_VALIDATE_STRING
66 F_ALLOW_CONTROL = 1 << B_ALLOW_CONTROL
67 )
68
69 const (
70 MAX_RECURSE = 4096
71 )
72
73 const (
74 SPACE_MASK = (1 << ' ') | (1 << '\t') | (1 << '\r') | (1 << '\n')
75 )
76
77 const (
78 ERR_EOF ParsingError = 1
79 ERR_INVALID_CHAR ParsingError = 2
80 ERR_INVALID_ESCAPE ParsingError = 3
81 ERR_INVALID_UNICODE ParsingError = 4
82 ERR_INTEGER_OVERFLOW ParsingError = 5
83 ERR_INVALID_NUMBER_FMT ParsingError = 6
84 ERR_RECURSE_EXCEED_MAX ParsingError = 7
85 ERR_FLOAT_INFINITY ParsingError = 8
86 ERR_MISMATCH ParsingError = 9
87 ERR_INVALID_UTF8 ParsingError = 10
88
89
90 ERR_NOT_FOUND ParsingError = 33
91 ERR_UNSUPPORT_TYPE ParsingError = 34
92 )
93
94 var _ParsingErrors = []string{
95 0 : "ok",
96 ERR_EOF : "eof",
97 ERR_INVALID_CHAR : "invalid char",
98 ERR_INVALID_ESCAPE : "invalid escape char",
99 ERR_INVALID_UNICODE : "invalid unicode escape",
100 ERR_INTEGER_OVERFLOW : "integer overflow",
101 ERR_INVALID_NUMBER_FMT : "invalid number format",
102 ERR_RECURSE_EXCEED_MAX : "recursion exceeded max depth",
103 ERR_FLOAT_INFINITY : "float number is infinity",
104 ERR_MISMATCH : "mismatched type with value",
105 ERR_INVALID_UTF8 : "invalid UTF8",
106 }
107
108 func (self ParsingError) Error() string {
109 return "json: error when parsing input: " + self.Message()
110 }
111
112 func (self ParsingError) Message() string {
113 if int(self) < len(_ParsingErrors) {
114 return _ParsingErrors[self]
115 } else {
116 return fmt.Sprintf("unknown error %d", self)
117 }
118 }
119
120 type JsonState struct {
121 Vt ValueType
122 Dv float64
123 Iv int64
124 Ep int
125 Dbuf *byte
126 Dcap int
127 }
128
129 type StateMachine struct {
130 Sp int
131 Vt [MAX_RECURSE]int
132 }
133
134 var stackPool = sync.Pool{
135 New: func()interface{}{
136 return &StateMachine{}
137 },
138 }
139
140 func NewStateMachine() *StateMachine {
141 return stackPool.Get().(*StateMachine)
142 }
143
144 func FreeStateMachine(fsm *StateMachine) {
145 stackPool.Put(fsm)
146 }
147
148 const MaxDigitNums = 800
149
150 var digitPool = sync.Pool{
151 New: func() interface{} {
152 return (*byte)(unsafe.Pointer(&[MaxDigitNums]byte{}))
153 },
154 }
155
156 func NewDbuf() *byte {
157 return digitPool.Get().(*byte)
158 }
159
160 func FreeDbuf(p *byte) {
161 digitPool.Put(p)
162 }
View as plain text