1/**
2 *  Copyright 2014 Paul Querna
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License");
5 *  you may not use this file except in compliance with the License.
6 *  You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 *
16 */
17
18package v1
19
20import (
21	"fmt"
22	"io"
23	"unicode"
24	"unicode/utf16"
25)
26
27const sliceStringMask = cIJC | cNFP
28
29type ffReader struct {
30	s []byte
31	i int
32	l int
33}
34
35func newffReader(d []byte) *ffReader {
36	return &ffReader{
37		s: d,
38		i: 0,
39		l: len(d),
40	}
41}
42
43func (r *ffReader) Pos() int {
44	return r.i
45}
46
47// Reset the reader, and add new input.
48func (r *ffReader) Reset(d []byte) {
49	r.s = d
50	r.i = 0
51	r.l = len(d)
52}
53
54// Calcuates the Position with line and line offset,
55// because this isn't counted for performance reasons,
56// it will iterate the buffer from the beginning, and should
57// only be used in error-paths.
58func (r *ffReader) PosWithLine() (int, int) {
59	currentLine := 1
60	currentChar := 0
61
62	for i := 0; i < r.i; i++ {
63		c := r.s[i]
64		currentChar++
65		if c == '\n' {
66			currentLine++
67			currentChar = 0
68		}
69	}
70
71	return currentLine, currentChar
72}
73
74func (r *ffReader) ReadByteNoWS() (byte, error) {
75	if r.i >= r.l {
76		return 0, io.EOF
77	}
78
79	j := r.i
80
81	for {
82		c := r.s[j]
83		j++
84
85		// inline whitespace parsing gives another ~8% performance boost
86		// for many kinds of nicely indented JSON.
87		// ... and using a [255]bool instead of multiple ifs, gives another 2%
88		/*
89			if c != '\t' &&
90				c != '\n' &&
91				c != '\v' &&
92				c != '\f' &&
93				c != '\r' &&
94				c != ' ' {
95				r.i = j
96				return c, nil
97			}
98		*/
99		if whitespaceLookupTable[c] == false {
100			r.i = j
101			return c, nil
102		}
103
104		if j >= r.l {
105			return 0, io.EOF
106		}
107	}
108}
109
110func (r *ffReader) ReadByte() (byte, error) {
111	if r.i >= r.l {
112		return 0, io.EOF
113	}
114
115	r.i++
116
117	return r.s[r.i-1], nil
118}
119
120func (r *ffReader) UnreadByte() {
121	if r.i <= 0 {
122		panic("ffReader.UnreadByte: at beginning of slice")
123	}
124	r.i--
125}
126
127func (r *ffReader) readU4(j int) (rune, error) {
128
129	var u4 [4]byte
130	for i := 0; i < 4; i++ {
131		if j >= r.l {
132			return -1, io.EOF
133		}
134		c := r.s[j]
135		if byteLookupTable[c]&cVHC != 0 {
136			u4[i] = c
137			j++
138			continue
139		} else {
140			// TODO(pquerna): handle errors better. layering violation.
141			return -1, fmt.Errorf("lex_string_invalid_hex_char: %v %v", c, string(u4[:]))
142		}
143	}
144
145	// TODO(pquerna): utf16.IsSurrogate
146	rr, err := ParseUint(u4[:], 16, 64)
147	if err != nil {
148		return -1, err
149	}
150	return rune(rr), nil
151}
152
153func (r *ffReader) handleEscaped(c byte, j int, out DecodingBuffer) (int, error) {
154	if j >= r.l {
155		return 0, io.EOF
156	}
157
158	c = r.s[j]
159	j++
160
161	if c == 'u' {
162		ru, err := r.readU4(j)
163		if err != nil {
164			return 0, err
165		}
166
167		if utf16.IsSurrogate(ru) {
168			ru2, err := r.readU4(j + 6)
169			if err != nil {
170				return 0, err
171			}
172			out.Write(r.s[r.i : j-2])
173			r.i = j + 10
174			j = r.i
175			rval := utf16.DecodeRune(ru, ru2)
176			if rval != unicode.ReplacementChar {
177				out.WriteRune(rval)
178			} else {
179				return 0, fmt.Errorf("lex_string_invalid_unicode_surrogate: %v %v", ru, ru2)
180			}
181		} else {
182			out.Write(r.s[r.i : j-2])
183			r.i = j + 4
184			j = r.i
185			out.WriteRune(ru)
186		}
187		return j, nil
188	} else if byteLookupTable[c]&cVEC == 0 {
189		return 0, fmt.Errorf("lex_string_invalid_escaped_char: %v", c)
190	} else {
191		out.Write(r.s[r.i : j-2])
192		r.i = j
193		j = r.i
194
195		switch c {
196		case '"':
197			out.WriteByte('"')
198		case '\\':
199			out.WriteByte('\\')
200		case '/':
201			out.WriteByte('/')
202		case 'b':
203			out.WriteByte('\b')
204		case 'f':
205			out.WriteByte('\f')
206		case 'n':
207			out.WriteByte('\n')
208		case 'r':
209			out.WriteByte('\r')
210		case 't':
211			out.WriteByte('\t')
212		}
213	}
214
215	return j, nil
216}
217
218func (r *ffReader) SliceString(out DecodingBuffer) error {
219	var c byte
220	// TODO(pquerna): string_with_escapes? de-escape here?
221	j := r.i
222
223	for {
224		if j >= r.l {
225			return io.EOF
226		}
227
228		j, c = scanString(r.s, j)
229
230		if c == '"' {
231			if j != r.i {
232				out.Write(r.s[r.i : j-1])
233				r.i = j
234			}
235			return nil
236		} else if c == '\\' {
237			var err error
238			j, err = r.handleEscaped(c, j, out)
239			if err != nil {
240				return err
241			}
242		} else if byteLookupTable[c]&cIJC != 0 {
243			return fmt.Errorf("lex_string_invalid_json_char: %v", c)
244		}
245		continue
246	}
247
248	panic("ffjson: SliceString unreached exit")
249}
250
251// TODO(pquerna): consider combining wibth the normal byte mask.
252var whitespaceLookupTable [256]bool = [256]bool{
253	false, /* 0 */
254	false, /* 1 */
255	false, /* 2 */
256	false, /* 3 */
257	false, /* 4 */
258	false, /* 5 */
259	false, /* 6 */
260	false, /* 7 */
261	false, /* 8 */
262	true,  /* 9 */
263	true,  /* 10 */
264	true,  /* 11 */
265	true,  /* 12 */
266	true,  /* 13 */
267	false, /* 14 */
268	false, /* 15 */
269	false, /* 16 */
270	false, /* 17 */
271	false, /* 18 */
272	false, /* 19 */
273	false, /* 20 */
274	false, /* 21 */
275	false, /* 22 */
276	false, /* 23 */
277	false, /* 24 */
278	false, /* 25 */
279	false, /* 26 */
280	false, /* 27 */
281	false, /* 28 */
282	false, /* 29 */
283	false, /* 30 */
284	false, /* 31 */
285	true,  /* 32 */
286	false, /* 33 */
287	false, /* 34 */
288	false, /* 35 */
289	false, /* 36 */
290	false, /* 37 */
291	false, /* 38 */
292	false, /* 39 */
293	false, /* 40 */
294	false, /* 41 */
295	false, /* 42 */
296	false, /* 43 */
297	false, /* 44 */
298	false, /* 45 */
299	false, /* 46 */
300	false, /* 47 */
301	false, /* 48 */
302	false, /* 49 */
303	false, /* 50 */
304	false, /* 51 */
305	false, /* 52 */
306	false, /* 53 */
307	false, /* 54 */
308	false, /* 55 */
309	false, /* 56 */
310	false, /* 57 */
311	false, /* 58 */
312	false, /* 59 */
313	false, /* 60 */
314	false, /* 61 */
315	false, /* 62 */
316	false, /* 63 */
317	false, /* 64 */
318	false, /* 65 */
319	false, /* 66 */
320	false, /* 67 */
321	false, /* 68 */
322	false, /* 69 */
323	false, /* 70 */
324	false, /* 71 */
325	false, /* 72 */
326	false, /* 73 */
327	false, /* 74 */
328	false, /* 75 */
329	false, /* 76 */
330	false, /* 77 */
331	false, /* 78 */
332	false, /* 79 */
333	false, /* 80 */
334	false, /* 81 */
335	false, /* 82 */
336	false, /* 83 */
337	false, /* 84 */
338	false, /* 85 */
339	false, /* 86 */
340	false, /* 87 */
341	false, /* 88 */
342	false, /* 89 */
343	false, /* 90 */
344	false, /* 91 */
345	false, /* 92 */
346	false, /* 93 */
347	false, /* 94 */
348	false, /* 95 */
349	false, /* 96 */
350	false, /* 97 */
351	false, /* 98 */
352	false, /* 99 */
353	false, /* 100 */
354	false, /* 101 */
355	false, /* 102 */
356	false, /* 103 */
357	false, /* 104 */
358	false, /* 105 */
359	false, /* 106 */
360	false, /* 107 */
361	false, /* 108 */
362	false, /* 109 */
363	false, /* 110 */
364	false, /* 111 */
365	false, /* 112 */
366	false, /* 113 */
367	false, /* 114 */
368	false, /* 115 */
369	false, /* 116 */
370	false, /* 117 */
371	false, /* 118 */
372	false, /* 119 */
373	false, /* 120 */
374	false, /* 121 */
375	false, /* 122 */
376	false, /* 123 */
377	false, /* 124 */
378	false, /* 125 */
379	false, /* 126 */
380	false, /* 127 */
381	false, /* 128 */
382	false, /* 129 */
383	false, /* 130 */
384	false, /* 131 */
385	false, /* 132 */
386	false, /* 133 */
387	false, /* 134 */
388	false, /* 135 */
389	false, /* 136 */
390	false, /* 137 */
391	false, /* 138 */
392	false, /* 139 */
393	false, /* 140 */
394	false, /* 141 */
395	false, /* 142 */
396	false, /* 143 */
397	false, /* 144 */
398	false, /* 145 */
399	false, /* 146 */
400	false, /* 147 */
401	false, /* 148 */
402	false, /* 149 */
403	false, /* 150 */
404	false, /* 151 */
405	false, /* 152 */
406	false, /* 153 */
407	false, /* 154 */
408	false, /* 155 */
409	false, /* 156 */
410	false, /* 157 */
411	false, /* 158 */
412	false, /* 159 */
413	false, /* 160 */
414	false, /* 161 */
415	false, /* 162 */
416	false, /* 163 */
417	false, /* 164 */
418	false, /* 165 */
419	false, /* 166 */
420	false, /* 167 */
421	false, /* 168 */
422	false, /* 169 */
423	false, /* 170 */
424	false, /* 171 */
425	false, /* 172 */
426	false, /* 173 */
427	false, /* 174 */
428	false, /* 175 */
429	false, /* 176 */
430	false, /* 177 */
431	false, /* 178 */
432	false, /* 179 */
433	false, /* 180 */
434	false, /* 181 */
435	false, /* 182 */
436	false, /* 183 */
437	false, /* 184 */
438	false, /* 185 */
439	false, /* 186 */
440	false, /* 187 */
441	false, /* 188 */
442	false, /* 189 */
443	false, /* 190 */
444	false, /* 191 */
445	false, /* 192 */
446	false, /* 193 */
447	false, /* 194 */
448	false, /* 195 */
449	false, /* 196 */
450	false, /* 197 */
451	false, /* 198 */
452	false, /* 199 */
453	false, /* 200 */
454	false, /* 201 */
455	false, /* 202 */
456	false, /* 203 */
457	false, /* 204 */
458	false, /* 205 */
459	false, /* 206 */
460	false, /* 207 */
461	false, /* 208 */
462	false, /* 209 */
463	false, /* 210 */
464	false, /* 211 */
465	false, /* 212 */
466	false, /* 213 */
467	false, /* 214 */
468	false, /* 215 */
469	false, /* 216 */
470	false, /* 217 */
471	false, /* 218 */
472	false, /* 219 */
473	false, /* 220 */
474	false, /* 221 */
475	false, /* 222 */
476	false, /* 223 */
477	false, /* 224 */
478	false, /* 225 */
479	false, /* 226 */
480	false, /* 227 */
481	false, /* 228 */
482	false, /* 229 */
483	false, /* 230 */
484	false, /* 231 */
485	false, /* 232 */
486	false, /* 233 */
487	false, /* 234 */
488	false, /* 235 */
489	false, /* 236 */
490	false, /* 237 */
491	false, /* 238 */
492	false, /* 239 */
493	false, /* 240 */
494	false, /* 241 */
495	false, /* 242 */
496	false, /* 243 */
497	false, /* 244 */
498	false, /* 245 */
499	false, /* 246 */
500	false, /* 247 */
501	false, /* 248 */
502	false, /* 249 */
503	false, /* 250 */
504	false, /* 251 */
505	false, /* 252 */
506	false, /* 253 */
507	false, /* 254 */
508	false, /* 255 */
509}
510