jsoniter.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. package jsoniter
  2. import (
  3. "io"
  4. "fmt"
  5. "unicode/utf16"
  6. "strconv"
  7. "unsafe"
  8. "encoding/base64"
  9. )
  10. type ValueType int
  11. const (
  12. Invalid ValueType = iota
  13. String
  14. Number
  15. Null
  16. Bool
  17. Array
  18. Object
  19. )
  20. var digits []byte
  21. var valueTypes []ValueType
  22. func init() {
  23. digits = make([]byte, 256)
  24. for i := 0; i < len(digits); i++ {
  25. digits[i] = 255
  26. }
  27. for i := '0'; i <= '9'; i++ {
  28. digits[i] = byte(i - '0');
  29. }
  30. for i := 'a'; i <= 'f'; i++ {
  31. digits[i] = byte((i - 'a') + 10);
  32. }
  33. for i := 'A'; i <= 'F'; i++ {
  34. digits[i] = byte((i - 'A') + 10);
  35. }
  36. valueTypes = make([]ValueType, 256)
  37. for i := 0; i < len(valueTypes); i++ {
  38. valueTypes[i] = Invalid
  39. }
  40. valueTypes['"'] = String;
  41. valueTypes['-'] = Number;
  42. valueTypes['0'] = Number;
  43. valueTypes['1'] = Number;
  44. valueTypes['2'] = Number;
  45. valueTypes['3'] = Number;
  46. valueTypes['4'] = Number;
  47. valueTypes['5'] = Number;
  48. valueTypes['6'] = Number;
  49. valueTypes['7'] = Number;
  50. valueTypes['8'] = Number;
  51. valueTypes['9'] = Number;
  52. valueTypes['t'] = Bool;
  53. valueTypes['f'] = Bool;
  54. valueTypes['n'] = Null;
  55. valueTypes['['] = Array;
  56. valueTypes['{'] = Object;
  57. }
  58. type Iterator struct {
  59. reader io.Reader
  60. buf []byte
  61. head int
  62. tail int
  63. Error error
  64. }
  65. func Parse(reader io.Reader, bufSize int) *Iterator {
  66. iter := &Iterator{
  67. reader: reader,
  68. buf: make([]byte, bufSize),
  69. head: 0,
  70. tail: 0,
  71. }
  72. iter.skipWhitespaces()
  73. return iter
  74. }
  75. func ParseBytes(input []byte) *Iterator {
  76. iter := &Iterator{
  77. reader: nil,
  78. buf: input,
  79. head: 0,
  80. tail: len(input),
  81. }
  82. iter.skipWhitespaces()
  83. return iter
  84. }
  85. func ParseString(input string) *Iterator {
  86. return ParseBytes([]byte(input))
  87. }
  88. func (iter *Iterator) Reset(reader io.Reader) *Iterator {
  89. iter.reader = reader
  90. iter.head = 0
  91. iter.tail = 0
  92. iter.skipWhitespaces()
  93. return iter
  94. }
  95. func (iter *Iterator) ResetBytes(input []byte) *Iterator {
  96. // only for benchmarking
  97. iter.reader = nil
  98. iter.Error = nil
  99. iter.buf = input
  100. iter.head = 0
  101. iter.tail = len(input)
  102. iter.skipWhitespaces()
  103. return iter
  104. }
  105. func (iter *Iterator) WhatIsNext() ValueType {
  106. valueType := valueTypes[iter.readByte()];
  107. iter.unreadByte();
  108. return valueType;
  109. }
  110. func (iter *Iterator) skipWhitespaces() {
  111. for {
  112. for i := iter.head; i < iter.tail; i++ {
  113. c := iter.buf[i]
  114. switch c {
  115. case ' ', '\n', '\t', '\r':
  116. continue
  117. }
  118. iter.head = i
  119. return
  120. }
  121. if !iter.loadMore() {
  122. return
  123. }
  124. }
  125. }
  126. func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool {
  127. for i := iter.head; i < iter.tail; i++ {
  128. c := iter.buf[i]
  129. switch c {
  130. case ' ', '\n', '\t', '\r':
  131. continue
  132. }
  133. iter.head = i
  134. return false
  135. }
  136. return true
  137. }
  138. func (iter *Iterator) nextToken() byte {
  139. // a variation of skip whitespaces, returning the next non-whitespace token
  140. for {
  141. for i := iter.head; i < iter.tail; i++ {
  142. c := iter.buf[i]
  143. switch c {
  144. case ' ', '\n', '\t', 'r':
  145. continue
  146. }
  147. iter.head = i+1
  148. return c
  149. }
  150. if !iter.loadMore() {
  151. return 0
  152. }
  153. }
  154. }
  155. func (iter *Iterator) ReportError(operation string, msg string) {
  156. if iter.Error != nil {
  157. return
  158. }
  159. peekStart := iter.head - 10
  160. if peekStart < 0 {
  161. peekStart = 0
  162. }
  163. iter.Error = fmt.Errorf("%s: %s, parsing %v ...%s... at %s", operation, msg, iter.head,
  164. string(iter.buf[peekStart: iter.head]), string(iter.buf[0:iter.tail]))
  165. }
  166. func (iter *Iterator) CurrentBuffer() string {
  167. peekStart := iter.head - 10
  168. if peekStart < 0 {
  169. peekStart = 0
  170. }
  171. return fmt.Sprintf("parsing %v ...|%s|... at %s", iter.head,
  172. string(iter.buf[peekStart: iter.head]), string(iter.buf[0:iter.tail]))
  173. }
  174. func (iter *Iterator) readByte() (ret byte) {
  175. if iter.head == iter.tail {
  176. if iter.loadMore() {
  177. ret = iter.buf[iter.head]
  178. iter.head++
  179. return ret
  180. } else {
  181. return 0
  182. }
  183. }
  184. ret = iter.buf[iter.head]
  185. iter.head++
  186. return ret
  187. }
  188. func (iter *Iterator) loadMore() bool {
  189. if iter.reader == nil {
  190. iter.Error = io.EOF
  191. return false
  192. }
  193. for {
  194. n, err := iter.reader.Read(iter.buf)
  195. if n == 0 {
  196. if err != nil {
  197. iter.Error = err
  198. return false
  199. } else {
  200. // n == 0, err == nil is not EOF
  201. continue
  202. }
  203. } else {
  204. iter.head = 0
  205. iter.tail = n
  206. return true
  207. }
  208. }
  209. }
  210. func (iter *Iterator) unreadByte() {
  211. if iter.head == 0 {
  212. iter.ReportError("unreadByte", "unread too many bytes")
  213. return
  214. }
  215. iter.head -= 1
  216. return
  217. }
  218. const maxUint64 = (1 << 64 - 1)
  219. const cutoffUint64 = maxUint64 / 10 + 1
  220. const maxUint32 = (1 << 32 - 1)
  221. const cutoffUint32 = maxUint32 / 10 + 1
  222. func (iter *Iterator) ReadUint() (ret uint) {
  223. val := iter.ReadUint64()
  224. converted := uint(val)
  225. if uint64(converted) != val {
  226. iter.ReportError("ReadUint", "int overflow")
  227. return
  228. }
  229. return converted
  230. }
  231. func (iter *Iterator) ReadUint8() (ret uint8) {
  232. val := iter.ReadUint64()
  233. converted := uint8(val)
  234. if uint64(converted) != val {
  235. iter.ReportError("ReadUint8", "int overflow")
  236. return
  237. }
  238. return converted
  239. }
  240. func (iter *Iterator) ReadUint16() (ret uint16) {
  241. val := iter.ReadUint64()
  242. converted := uint16(val)
  243. if uint64(converted) != val {
  244. iter.ReportError("ReadUint16", "int overflow")
  245. return
  246. }
  247. return converted
  248. }
  249. func (iter *Iterator) ReadUint32() (ret uint32) {
  250. val := iter.ReadUint64()
  251. converted := uint32(val)
  252. if uint64(converted) != val {
  253. iter.ReportError("ReadUint32", "int overflow")
  254. return
  255. }
  256. return converted
  257. }
  258. func (iter *Iterator) ReadUint64() (ret uint64) {
  259. c := iter.readByte()
  260. v := digits[c]
  261. if v == 0 {
  262. return 0 // single zero
  263. }
  264. if v == 255 {
  265. iter.ReportError("ReadUint64", "unexpected character")
  266. return
  267. }
  268. for {
  269. if ret >= cutoffUint64 {
  270. iter.ReportError("ReadUint64", "overflow")
  271. return
  272. }
  273. ret = ret * 10 + uint64(v)
  274. c = iter.readByte()
  275. v = digits[c]
  276. if v == 255 {
  277. iter.unreadByte()
  278. break
  279. }
  280. }
  281. return ret
  282. }
  283. func (iter *Iterator) ReadInt() (ret int) {
  284. val := iter.ReadInt64()
  285. converted := int(val)
  286. if int64(converted) != val {
  287. iter.ReportError("ReadInt", "int overflow")
  288. return
  289. }
  290. return converted
  291. }
  292. func (iter *Iterator) ReadInt8() (ret int8) {
  293. val := iter.ReadInt64()
  294. converted := int8(val)
  295. if int64(converted) != val {
  296. iter.ReportError("ReadInt8", "int overflow")
  297. return
  298. }
  299. return converted
  300. }
  301. func (iter *Iterator) ReadInt16() (ret int16) {
  302. val := iter.ReadInt64()
  303. converted := int16(val)
  304. if int64(converted) != val {
  305. iter.ReportError("ReadInt16", "int overflow")
  306. return
  307. }
  308. return converted
  309. }
  310. func (iter *Iterator) ReadInt32() (ret int32) {
  311. val := iter.ReadInt64()
  312. converted := int32(val)
  313. if int64(converted) != val {
  314. iter.ReportError("ReadInt32", "int overflow")
  315. return
  316. }
  317. return converted
  318. }
  319. func (iter *Iterator) ReadInt64() (ret int64) {
  320. c := iter.readByte()
  321. if iter.Error != nil {
  322. return
  323. }
  324. /* optional leading minus */
  325. if c == '-' {
  326. n := iter.ReadUint64()
  327. return -int64(n)
  328. } else {
  329. iter.unreadByte()
  330. n := iter.ReadUint64()
  331. return int64(n)
  332. }
  333. }
  334. func (iter *Iterator) ReadString() (ret string) {
  335. return string(iter.readStringAsBytes())
  336. }
  337. func (iter *Iterator) readStringAsBytes() (ret []byte) {
  338. c := iter.readByte()
  339. if c == 'n' {
  340. iter.skipUntilBreak()
  341. return
  342. }
  343. if c != '"' {
  344. iter.ReportError("ReadString", `expects " or n`)
  345. return
  346. }
  347. end := iter.findStringEndWithoutEscape()
  348. if end != -1 {
  349. // fast path: reuse the underlying buffer
  350. ret = iter.buf[iter.head:end-1]
  351. iter.head = end
  352. return ret
  353. }
  354. str := make([]byte, 0, 8)
  355. for iter.Error == nil {
  356. c = iter.readByte()
  357. if c == '"' {
  358. return str
  359. }
  360. if c == '\\' {
  361. c = iter.readByte()
  362. if iter.Error != nil {
  363. return
  364. }
  365. switch c {
  366. case 'u':
  367. r := iter.readU4()
  368. if iter.Error != nil {
  369. return
  370. }
  371. if utf16.IsSurrogate(r) {
  372. c = iter.readByte()
  373. if iter.Error != nil {
  374. return
  375. }
  376. if c != '\\' {
  377. iter.ReportError("ReadString",
  378. `expects \u after utf16 surrogate, but \ not found`)
  379. return
  380. }
  381. c = iter.readByte()
  382. if iter.Error != nil {
  383. return
  384. }
  385. if c != 'u' {
  386. iter.ReportError("ReadString",
  387. `expects \u after utf16 surrogate, but \u not found`)
  388. return
  389. }
  390. r2 := iter.readU4()
  391. if iter.Error != nil {
  392. return
  393. }
  394. combined := utf16.DecodeRune(r, r2)
  395. str = appendRune(str, combined)
  396. } else {
  397. str = appendRune(str, r)
  398. }
  399. case '"':
  400. str = append(str, '"')
  401. case '\\':
  402. str = append(str, '\\')
  403. case '/':
  404. str = append(str, '/')
  405. case 'b':
  406. str = append(str, '\b')
  407. case 'f':
  408. str = append(str, '\f')
  409. case 'n':
  410. str = append(str, '\n')
  411. case 'r':
  412. str = append(str, '\r')
  413. case 't':
  414. str = append(str, '\t')
  415. default:
  416. iter.ReportError("ReadString",
  417. `invalid escape char after \`)
  418. return
  419. }
  420. } else {
  421. str = append(str, c)
  422. }
  423. }
  424. return
  425. }
  426. func (iter *Iterator) readU4() (ret rune) {
  427. for i := 0; i < 4; i++ {
  428. c := iter.readByte()
  429. if iter.Error != nil {
  430. return
  431. }
  432. if (c >= '0' && c <= '9') {
  433. if ret >= cutoffUint32 {
  434. iter.ReportError("readU4", "overflow")
  435. return
  436. }
  437. ret = ret * 16 + rune(c - '0')
  438. } else if ((c >= 'a' && c <= 'f') ) {
  439. if ret >= cutoffUint32 {
  440. iter.ReportError("readU4", "overflow")
  441. return
  442. }
  443. ret = ret * 16 + rune(c - 'a' + 10)
  444. } else {
  445. iter.ReportError("readU4", "expects 0~9 or a~f")
  446. return
  447. }
  448. }
  449. return ret
  450. }
  451. const (
  452. t1 = 0x00 // 0000 0000
  453. tx = 0x80 // 1000 0000
  454. t2 = 0xC0 // 1100 0000
  455. t3 = 0xE0 // 1110 0000
  456. t4 = 0xF0 // 1111 0000
  457. t5 = 0xF8 // 1111 1000
  458. maskx = 0x3F // 0011 1111
  459. mask2 = 0x1F // 0001 1111
  460. mask3 = 0x0F // 0000 1111
  461. mask4 = 0x07 // 0000 0111
  462. rune1Max = 1 << 7 - 1
  463. rune2Max = 1 << 11 - 1
  464. rune3Max = 1 << 16 - 1
  465. surrogateMin = 0xD800
  466. surrogateMax = 0xDFFF
  467. MaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
  468. RuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
  469. )
  470. func appendRune(p []byte, r rune) []byte {
  471. // Negative values are erroneous. Making it unsigned addresses the problem.
  472. switch i := uint32(r); {
  473. case i <= rune1Max:
  474. p = append(p, byte(r))
  475. return p
  476. case i <= rune2Max:
  477. p = append(p, t2 | byte(r >> 6))
  478. p = append(p, tx | byte(r) & maskx)
  479. return p
  480. case i > MaxRune, surrogateMin <= i && i <= surrogateMax:
  481. r = RuneError
  482. fallthrough
  483. case i <= rune3Max:
  484. p = append(p, t3 | byte(r >> 12))
  485. p = append(p, tx | byte(r >> 6) & maskx)
  486. p = append(p, tx | byte(r) & maskx)
  487. return p
  488. default:
  489. p = append(p, t4 | byte(r >> 18))
  490. p = append(p, tx | byte(r >> 12) & maskx)
  491. p = append(p, tx | byte(r >> 6) & maskx)
  492. p = append(p, tx | byte(r) & maskx)
  493. return p
  494. }
  495. }
  496. func (iter *Iterator) ReadArray() (ret bool) {
  497. c := iter.nextToken()
  498. if iter.Error != nil {
  499. return
  500. }
  501. switch c {
  502. case 'n': {
  503. iter.skipUntilBreak()
  504. return false // null
  505. }
  506. case '[': {
  507. c = iter.nextToken()
  508. if iter.Error != nil {
  509. return
  510. }
  511. if c == ']' {
  512. return false
  513. } else {
  514. iter.unreadByte()
  515. return true
  516. }
  517. }
  518. case ']': return false
  519. case ',':
  520. iter.skipWhitespaces()
  521. return true
  522. default:
  523. iter.ReportError("ReadArray", "expect [ or , or ] or n")
  524. return
  525. }
  526. }
  527. func (iter *Iterator) ReadObject() (ret string) {
  528. c := iter.nextToken()
  529. if iter.Error != nil {
  530. return
  531. }
  532. switch c {
  533. case 'n': {
  534. iter.skipUntilBreak()
  535. if iter.Error != nil {
  536. return
  537. }
  538. return "" // null
  539. }
  540. case '{': {
  541. c = iter.nextToken()
  542. if iter.Error != nil {
  543. return
  544. }
  545. switch c {
  546. case '}':
  547. return "" // end of object
  548. case '"':
  549. iter.unreadByte()
  550. return iter.readObjectField()
  551. default:
  552. iter.ReportError("ReadObject", `expect " after {`)
  553. return
  554. }
  555. }
  556. case ',':
  557. iter.skipWhitespaces()
  558. return iter.readObjectField()
  559. case '}':
  560. return "" // end of object
  561. default:
  562. iter.ReportError("ReadObject", `expect { or , or } or n`)
  563. return
  564. }
  565. }
  566. func (iter *Iterator) readObjectField() (ret string) {
  567. str := iter.readStringAsBytes()
  568. if iter.skipWhitespacesWithoutLoadMore() {
  569. if ret == "" {
  570. ret = string(str);
  571. }
  572. if !iter.loadMore() {
  573. return
  574. }
  575. }
  576. if iter.buf[iter.head] != ':' {
  577. iter.ReportError("ReadObject", "expect : after object field")
  578. return
  579. }
  580. iter.head++
  581. if iter.skipWhitespacesWithoutLoadMore() {
  582. if ret == "" {
  583. ret = string(str);
  584. }
  585. if !iter.loadMore() {
  586. return
  587. }
  588. }
  589. if ret == "" {
  590. return *(*string)(unsafe.Pointer(&str))
  591. }
  592. return ret
  593. }
  594. func (iter *Iterator) ReadFloat32() (ret float32) {
  595. strBuf := [8]byte{}
  596. str := strBuf[0:0]
  597. hasMore := true
  598. for(hasMore) {
  599. for i := iter.head; i < iter.tail; i++ {
  600. c := iter.buf[i]
  601. switch c {
  602. case '-', '+', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  603. str = append(str, c)
  604. continue
  605. default:
  606. hasMore = false
  607. break
  608. }
  609. }
  610. if hasMore {
  611. if !iter.loadMore() {
  612. break
  613. }
  614. }
  615. }
  616. if iter.Error != nil && iter.Error != io.EOF {
  617. return
  618. }
  619. val, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&str)), 32)
  620. if err != nil {
  621. iter.Error = err
  622. return
  623. }
  624. return float32(val)
  625. }
  626. func (iter *Iterator) ReadNumber() (ret string) {
  627. strBuf := [8]byte{}
  628. str := strBuf[0:0]
  629. hasMore := true
  630. for(hasMore) {
  631. for i := iter.head; i < iter.tail; i++ {
  632. c := iter.buf[i]
  633. switch c {
  634. case '-', '+', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  635. str = append(str, c)
  636. continue
  637. default:
  638. hasMore = false
  639. break
  640. }
  641. }
  642. if hasMore {
  643. if !iter.loadMore() {
  644. break
  645. }
  646. }
  647. }
  648. if iter.Error != nil && iter.Error != io.EOF {
  649. return
  650. }
  651. return string(str)
  652. }
  653. func (iter *Iterator) ReadFloat64() (ret float64) {
  654. strBuf := [8]byte{}
  655. str := strBuf[0:0]
  656. hasMore := true
  657. for(hasMore) {
  658. for i := iter.head; i < iter.tail; i++ {
  659. c := iter.buf[i]
  660. switch c {
  661. case '-', '+', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
  662. str = append(str, c)
  663. continue
  664. default:
  665. hasMore = false
  666. break
  667. }
  668. }
  669. if hasMore {
  670. if !iter.loadMore() {
  671. break
  672. }
  673. }
  674. }
  675. if iter.Error != nil && iter.Error != io.EOF {
  676. return
  677. }
  678. val, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&str)), 64)
  679. if err != nil {
  680. iter.Error = err
  681. return
  682. }
  683. return val
  684. }
  685. func (iter *Iterator) ReadBool() (ret bool) {
  686. c := iter.readByte()
  687. if iter.Error != nil {
  688. return
  689. }
  690. switch c {
  691. case 't':
  692. iter.skipUntilBreak()
  693. return true
  694. case 'f':
  695. iter.skipUntilBreak()
  696. return false
  697. default:
  698. iter.ReportError("ReadBool", "expect t or f")
  699. return
  700. }
  701. }
  702. func (iter *Iterator) ReadBase64() (ret []byte) {
  703. src := iter.readStringAsBytes()
  704. if iter.Error != nil {
  705. return
  706. }
  707. b64 := base64.StdEncoding
  708. ret = make([]byte, b64.DecodedLen(len(src)))
  709. n, err := b64.Decode(ret, src)
  710. if err != nil {
  711. iter.Error = err
  712. return
  713. }
  714. return ret[:n]
  715. }
  716. func (iter *Iterator) ReadNull() (ret bool) {
  717. c := iter.readByte()
  718. if c == 'n' {
  719. iter.skipUntilBreak()
  720. return true
  721. }
  722. iter.unreadByte()
  723. return false
  724. }
  725. func (iter *Iterator) Skip() {
  726. c := iter.readByte()
  727. switch c {
  728. case '"':
  729. iter.skipString()
  730. case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't', 'f', 'n':
  731. iter.skipUntilBreak()
  732. case '[':
  733. iter.skipArray()
  734. case '{':
  735. iter.skipObject()
  736. default:
  737. iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c))
  738. return
  739. }
  740. }
  741. func (iter *Iterator) skipString() {
  742. for {
  743. end, escaped := iter.findStringEnd()
  744. if end == -1 {
  745. if !iter.loadMore() {
  746. return
  747. }
  748. if escaped {
  749. iter.head = 1 // skip the first char as last char read is \
  750. }
  751. } else {
  752. iter.head = end
  753. return
  754. }
  755. }
  756. }
  757. // adapted from: https://github.com/buger/jsonparser/blob/master/parser.go
  758. // Tries to find the end of string
  759. // Support if string contains escaped quote symbols.
  760. func (iter *Iterator) findStringEnd() (int, bool) {
  761. escaped := false
  762. for i := iter.head; i < iter.tail; i++ {
  763. c := iter.buf[i]
  764. if c == '"' {
  765. if !escaped {
  766. return i + 1, false
  767. } else {
  768. j := i - 1
  769. for {
  770. if j < iter.head || iter.buf[j] != '\\' {
  771. // even number of backslashes
  772. // either end of buffer, or " found
  773. return i + 1, true
  774. }
  775. j--
  776. if j < iter.head || iter.buf[j] != '\\' {
  777. // odd number of backslashes
  778. // it is \" or \\\"
  779. break
  780. }
  781. j--
  782. }
  783. }
  784. } else if c == '\\' {
  785. escaped = true
  786. }
  787. }
  788. j := iter.tail - 1
  789. for {
  790. if j < iter.head || iter.buf[j] != '\\' {
  791. // even number of backslashes
  792. // either end of buffer, or " found
  793. return -1, false // do not end with \
  794. }
  795. j--
  796. if j < iter.head || iter.buf[j] != '\\' {
  797. // odd number of backslashes
  798. // it is \" or \\\"
  799. break
  800. }
  801. j--
  802. }
  803. return -1, true // end with \
  804. }
  805. func (iter *Iterator) findStringEndWithoutEscape() int {
  806. for i := iter.head; i < iter.tail; i++ {
  807. c := iter.buf[i]
  808. if c == '"' {
  809. return i + 1
  810. } else if c == '\\' {
  811. return -1
  812. }
  813. }
  814. return -1
  815. }
  816. func (iter *Iterator) skipArray() {
  817. level := 1
  818. for {
  819. for i := iter.head; i < iter.tail; i++ {
  820. switch iter.buf[i] {
  821. case '"': // If inside string, skip it
  822. iter.head = i + 1
  823. iter.skipString()
  824. i = iter.head - 1 // it will be i++ soon
  825. case '[': // If open symbol, increase level
  826. level++
  827. case ']': // If close symbol, increase level
  828. level--
  829. // If we have returned to the original level, we're done
  830. if level == 0 {
  831. iter.head = i + 1
  832. return
  833. }
  834. }
  835. }
  836. if (!iter.loadMore()) {
  837. return
  838. }
  839. }
  840. }
  841. func (iter *Iterator) skipObject() {
  842. level := 1
  843. for {
  844. for i := iter.head; i < iter.tail; i++ {
  845. switch iter.buf[i] {
  846. case '"': // If inside string, skip it
  847. iter.head = i + 1
  848. iter.skipString()
  849. i = iter.head - 1 // it will be i++ soon
  850. case '{': // If open symbol, increase level
  851. level++
  852. case '}': // If close symbol, increase level
  853. level--
  854. // If we have returned to the original level, we're done
  855. if level == 0 {
  856. iter.head = i + 1
  857. return
  858. }
  859. }
  860. }
  861. if (!iter.loadMore()) {
  862. return
  863. }
  864. }
  865. }
  866. func (iter *Iterator) skipUntilBreak() {
  867. // true, false, null, number
  868. for {
  869. for i := iter.head; i < iter.tail; i++ {
  870. c := iter.buf[i]
  871. switch c {
  872. case ' ', '\n', '\r', '\t', ',', '}', ']':
  873. iter.head = i
  874. return
  875. }
  876. }
  877. if (!iter.loadMore()) {
  878. return
  879. }
  880. }
  881. }