...
1
2
3
4 package codec
5
6 import (
7 "bufio"
8 "bytes"
9 "io"
10 "strings"
11 )
12
13
14
15 type decReader interface {
16
17
18
19 readx(n uint) []byte
20
21 readb([]byte)
22
23 readn1() byte
24 readn2() [2]byte
25 readn3() [3]byte
26 readn4() [4]byte
27 readn8() [8]byte
28
29
30
31
32
33 numread() uint
34
35
36 skipWhitespace() (token byte)
37
38
39
40
41 jsonReadNum() []byte
42
43
44
45 jsonReadAsisChars() []byte
46
47
48
49
50
51
52
53
54 readUntil(stop byte) (out []byte)
55 }
56
57
58
59 type unreadByteStatus uint8
60
61
62
63 const (
64 unreadByteUndefined unreadByteStatus = iota
65 unreadByteCanRead
66 unreadByteCanUnread
67 )
68
69
70
71
72
73
74 type ioReaderByteScanner interface {
75 io.Reader
76 io.ByteScanner
77
78
79
80 }
81
82
83
84 type ioReaderByteScannerT struct {
85 r io.Reader
86
87 l byte
88 ls unreadByteStatus
89
90 _ [2]byte
91 b [4]byte
92 }
93
94 func (z *ioReaderByteScannerT) ReadByte() (c byte, err error) {
95 if z.ls == unreadByteCanRead {
96 z.ls = unreadByteCanUnread
97 c = z.l
98 } else {
99 _, err = z.Read(z.b[:1])
100 c = z.b[0]
101 }
102 return
103 }
104
105 func (z *ioReaderByteScannerT) UnreadByte() (err error) {
106 switch z.ls {
107 case unreadByteCanUnread:
108 z.ls = unreadByteCanRead
109 case unreadByteCanRead:
110 err = errDecUnreadByteLastByteNotRead
111 case unreadByteUndefined:
112 err = errDecUnreadByteNothingToRead
113 default:
114 err = errDecUnreadByteUnknown
115 }
116 return
117 }
118
119 func (z *ioReaderByteScannerT) Read(p []byte) (n int, err error) {
120 if len(p) == 0 {
121 return
122 }
123 var firstByte bool
124 if z.ls == unreadByteCanRead {
125 z.ls = unreadByteCanUnread
126 p[0] = z.l
127 if len(p) == 1 {
128 n = 1
129 return
130 }
131 firstByte = true
132 p = p[1:]
133 }
134 n, err = z.r.Read(p)
135 if n > 0 {
136 if err == io.EOF && n == len(p) {
137 err = nil
138 }
139 z.l = p[n-1]
140 z.ls = unreadByteCanUnread
141 }
142 if firstByte {
143 n++
144 }
145 return
146 }
147
148 func (z *ioReaderByteScannerT) reset(r io.Reader) {
149 z.r = r
150 z.ls = unreadByteUndefined
151 z.l = 0
152 }
153
154
155 type ioDecReader struct {
156 rr ioReaderByteScannerT
157
158 n uint
159
160 blist *bytesFreelist
161
162 bufr []byte
163 br ioReaderByteScanner
164 bb *bufio.Reader
165
166 x [64 + 40]byte
167 }
168
169 func (z *ioDecReader) reset(r io.Reader, bufsize int, blist *bytesFreelist) {
170 z.blist = blist
171 z.n = 0
172 z.bufr = z.blist.check(z.bufr, 256)
173 z.br = nil
174
175 var ok bool
176
177 if bufsize <= 0 {
178 z.br, ok = r.(ioReaderByteScanner)
179 if !ok {
180 z.rr.reset(r)
181 z.br = &z.rr
182 }
183 return
184 }
185
186
187
188
189
190 switch bb := r.(type) {
191 case *strings.Reader:
192 z.br = bb
193 case *bytes.Buffer:
194 z.br = bb
195 case *bytes.Reader:
196 z.br = bb
197 case *bufio.Reader:
198 if bb.Size() == bufsize {
199 z.br = bb
200 }
201 }
202
203 if z.br == nil {
204 if z.bb != nil && z.bb.Size() == bufsize {
205 z.bb.Reset(r)
206 } else {
207 z.bb = bufio.NewReaderSize(r, bufsize)
208 }
209 z.br = z.bb
210 }
211 }
212
213 func (z *ioDecReader) numread() uint {
214 return z.n
215 }
216
217 func (z *ioDecReader) readn1() (b uint8) {
218 b, err := z.br.ReadByte()
219 halt.onerror(err)
220 z.n++
221 return
222 }
223
224 func (z *ioDecReader) readn2() (bs [2]byte) {
225 z.readb(bs[:])
226 return
227 }
228
229 func (z *ioDecReader) readn3() (bs [3]byte) {
230 z.readb(bs[:])
231 return
232 }
233
234 func (z *ioDecReader) readn4() (bs [4]byte) {
235 z.readb(bs[:])
236 return
237 }
238
239 func (z *ioDecReader) readn8() (bs [8]byte) {
240 z.readb(bs[:])
241 return
242 }
243
244 func (z *ioDecReader) readx(n uint) (bs []byte) {
245 if n == 0 {
246 return zeroByteSlice
247 }
248 if n < uint(len(z.x)) {
249 bs = z.x[:n]
250 } else {
251 bs = make([]byte, n)
252 }
253 nn, err := readFull(z.br, bs)
254 z.n += nn
255 halt.onerror(err)
256 return
257 }
258
259 func (z *ioDecReader) readb(bs []byte) {
260 if len(bs) == 0 {
261 return
262 }
263 nn, err := readFull(z.br, bs)
264 z.n += nn
265 halt.onerror(err)
266 }
267
268
269
270
271
272
273
274
275
276
277
278
279
280 func (z *ioDecReader) jsonReadNum() (bs []byte) {
281 z.unreadn1()
282 z.bufr = z.bufr[:0]
283 LOOP:
284
285 i, err := z.br.ReadByte()
286 if err == io.EOF {
287 return z.bufr
288 }
289 if err != nil {
290 halt.onerror(err)
291 }
292 z.n++
293 if isNumberChar(i) {
294 z.bufr = append(z.bufr, i)
295 goto LOOP
296 }
297 z.unreadn1()
298 return z.bufr
299 }
300
301 func (z *ioDecReader) jsonReadAsisChars() (bs []byte) {
302 z.bufr = z.bufr[:0]
303 LOOP:
304 i := z.readn1()
305 z.bufr = append(z.bufr, i)
306 if i == '"' || i == '\\' {
307 return z.bufr
308 }
309 goto LOOP
310 }
311
312 func (z *ioDecReader) skipWhitespace() (token byte) {
313 LOOP:
314 token = z.readn1()
315 if isWhitespaceChar(token) {
316 goto LOOP
317 }
318 return
319 }
320
321
322
323
324
325
326
327
328
329
330
331
332 func (z *ioDecReader) readUntil(stop byte) []byte {
333 z.bufr = z.bufr[:0]
334 LOOP:
335 token := z.readn1()
336 if token == stop {
337 return z.bufr
338 }
339 z.bufr = append(z.bufr, token)
340 goto LOOP
341 }
342
343 func (z *ioDecReader) unreadn1() {
344 err := z.br.UnreadByte()
345 halt.onerror(err)
346 z.n--
347 }
348
349
350
351
352
353
354
355
356
357
358
359
360
361 type bytesDecReader struct {
362 b []byte
363 c uint
364 }
365
366 func (z *bytesDecReader) reset(in []byte) {
367 z.b = in[:len(in):len(in)]
368 z.c = 0
369 }
370
371 func (z *bytesDecReader) numread() uint {
372 return z.c
373 }
374
375
376
377
378
379 func (z *bytesDecReader) readx(n uint) (bs []byte) {
380
381
382
383 bs = z.b[z.c : z.c+n]
384 z.c += n
385 return
386 }
387
388 func (z *bytesDecReader) readb(bs []byte) {
389 copy(bs, z.readx(uint(len(bs))))
390 }
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415 func (z *bytesDecReader) readn1() (v uint8) {
416 v = z.b[z.c]
417 z.c++
418 return
419 }
420
421 func (z *bytesDecReader) readn2() (bs [2]byte) {
422
423
424
425 bs = okBytes2(z.b[z.c : z.c+2])
426 z.c += 2
427 return
428 }
429
430 func (z *bytesDecReader) readn3() (bs [3]byte) {
431
432 bs = okBytes3(z.b[z.c : z.c+3])
433 z.c += 3
434 return
435 }
436
437 func (z *bytesDecReader) readn4() (bs [4]byte) {
438
439 bs = okBytes4(z.b[z.c : z.c+4])
440 z.c += 4
441 return
442 }
443
444 func (z *bytesDecReader) readn8() (bs [8]byte) {
445
446 bs = okBytes8(z.b[z.c : z.c+8])
447 z.c += 8
448 return
449 }
450
451 func (z *bytesDecReader) jsonReadNum() []byte {
452 z.c--
453 i := z.c
454 LOOP:
455
456 if i < uint(len(z.b)) && isNumberChar(z.b[i]) {
457 i++
458 goto LOOP
459 }
460 z.c, i = i, z.c
461
462
463 return z.b[i:z.c]
464 }
465
466 func (z *bytesDecReader) jsonReadAsisChars() []byte {
467 i := z.c
468 LOOP:
469 token := z.b[i]
470 i++
471 if token == '"' || token == '\\' {
472 z.c, i = i, z.c
473 return byteSliceOf(z.b, i, z.c)
474
475 }
476 goto LOOP
477 }
478
479 func (z *bytesDecReader) skipWhitespace() (token byte) {
480 i := z.c
481 LOOP:
482 token = z.b[i]
483 if isWhitespaceChar(token) {
484 i++
485 goto LOOP
486 }
487 z.c = i + 1
488 return
489 }
490
491 func (z *bytesDecReader) readUntil(stop byte) (out []byte) {
492 i := z.c
493 LOOP:
494 if z.b[i] == stop {
495 out = byteSliceOf(z.b, z.c, i)
496
497 z.c = i + 1
498 return
499 }
500 i++
501 goto LOOP
502 }
503
504
505
506 type decRd struct {
507 rb bytesDecReader
508 ri *ioDecReader
509
510 decReader
511
512 bytes bool
513
514
515
516
517 mtr bool
518 str bool
519
520 be bool
521 js bool
522 jsms bool
523 cbor bool
524
525 cbreak bool
526
527 }
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544 func (z *decRd) numread() uint {
545 if z.bytes {
546 return z.rb.numread()
547 }
548 return z.ri.numread()
549 }
550
551 func (z *decRd) readn1() (v uint8) {
552 if z.bytes {
553
554
555
556
557 v = z.rb.b[z.rb.c]
558 z.rb.c++
559 return
560 }
561 return z.ri.readn1()
562 }
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585 type devNullReader struct{}
586
587 func (devNullReader) Read(p []byte) (int, error) { return 0, io.EOF }
588 func (devNullReader) Close() error { return nil }
589
590 func readFull(r io.Reader, bs []byte) (n uint, err error) {
591 var nn int
592 for n < uint(len(bs)) && err == nil {
593 nn, err = r.Read(bs[n:])
594 if nn > 0 {
595 if err == io.EOF {
596
597 err = nil
598 }
599 n += uint(nn)
600 }
601 }
602
603
604 return
605 }
606
607 var _ decReader = (*decRd)(nil)
608
View as plain text