podman
1/*
2* Copyright 2021 ByteDance Inc.
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
17package ast18
19import (20`fmt`21
22`github.com/bytedance/sonic/internal/native/types`23`github.com/bytedance/sonic/internal/rt`24)
25
26const (27_DEFAULT_NODE_CAP int = 828_APPEND_GROW_SHIFT = 129)
30
31const (32_ERR_NOT_FOUND types.ParsingError = 3333_ERR_UNSUPPORT_TYPE types.ParsingError = 3434)
35
36var (37// ErrNotExist means both key and value doesn't exist38ErrNotExist error = newError(_ERR_NOT_FOUND, "value not exists")39
40// ErrUnsupportType means API on the node is unsupported41ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type")42)
43
44type Parser struct {45p int46s string47noLazy bool48skipValue bool49dbuf *byte50}
51
52/** Parser Private Methods **/
53
54func (self *Parser) delim() types.ParsingError {55n := len(self.s)56p := self.lspace(self.p)57
58/* check for EOF */59if p >= n {60return types.ERR_EOF61}62
63/* check for the delimtier */64if self.s[p] != ':' {65return types.ERR_INVALID_CHAR66}67
68/* update the read pointer */69self.p = p + 170return 071}
72
73func (self *Parser) object() types.ParsingError {74n := len(self.s)75p := self.lspace(self.p)76
77/* check for EOF */78if p >= n {79return types.ERR_EOF80}81
82/* check for the delimtier */83if self.s[p] != '{' {84return types.ERR_INVALID_CHAR85}86
87/* update the read pointer */88self.p = p + 189return 090}
91
92func (self *Parser) array() types.ParsingError {93n := len(self.s)94p := self.lspace(self.p)95
96/* check for EOF */97if p >= n {98return types.ERR_EOF99}100
101/* check for the delimtier */102if self.s[p] != '[' {103return types.ERR_INVALID_CHAR104}105
106/* update the read pointer */107self.p = p + 1108return 0109}
110
111func (self *Parser) lspace(sp int) int {112ns := len(self.s)113for ; sp<ns && isSpace(self.s[sp]); sp+=1 {}114
115return sp116}
117
118func (self *Parser) decodeArray(ret *linkedNodes) (Node, types.ParsingError) {119sp := self.p120ns := len(self.s)121
122/* check for EOF */123if self.p = self.lspace(sp); self.p >= ns {124return Node{}, types.ERR_EOF125}126
127/* check for empty array */128if self.s[self.p] == ']' {129self.p++130return Node{t: types.V_ARRAY}, 0131}132
133/* allocate array space and parse every element */134for {135var val Node136var err types.ParsingError137
138if self.skipValue {139/* skip the value */140var start int141if start, err = self.skipFast(); err != 0 {142return Node{}, err143}144if self.p > ns {145return Node{}, types.ERR_EOF146}147t := switchRawType(self.s[start])148if t == _V_NONE {149return Node{}, types.ERR_INVALID_CHAR150}151val = newRawNode(self.s[start:self.p], t)152}else{153/* decode the value */154if val, err = self.Parse(); err != 0 {155return Node{}, err156}157}158
159/* add the value to result */160ret.Add(val)161self.p = self.lspace(self.p)162
163/* check for EOF */164if self.p >= ns {165return Node{}, types.ERR_EOF166}167
168/* check for the next character */169switch self.s[self.p] {170case ',' : self.p++171case ']' : self.p++; return newArray(ret), 0172default:173// if val.isLazy() {174// return newLazyArray(self, ret), 0175// }176return Node{}, types.ERR_INVALID_CHAR177}178}179}
180
181func (self *Parser) decodeObject(ret *linkedPairs) (Node, types.ParsingError) {182sp := self.p183ns := len(self.s)184
185/* check for EOF */186if self.p = self.lspace(sp); self.p >= ns {187return Node{}, types.ERR_EOF188}189
190/* check for empty object */191if self.s[self.p] == '}' {192self.p++193return Node{t: types.V_OBJECT}, 0194}195
196/* decode each pair */197for {198var val Node199var njs types.JsonState200var err types.ParsingError201
202/* decode the key */203if njs = self.decodeValue(); njs.Vt != types.V_STRING {204return Node{}, types.ERR_INVALID_CHAR205}206
207/* extract the key */208idx := self.p - 1209key := self.s[njs.Iv:idx]210
211/* check for escape sequence */212if njs.Ep != -1 {213if key, err = unquote(key); err != 0 {214return Node{}, err215}216}217
218/* expect a ':' delimiter */219if err = self.delim(); err != 0 {220return Node{}, err221}222
223
224if self.skipValue {225/* skip the value */226var start int227if start, err = self.skipFast(); err != 0 {228return Node{}, err229}230if self.p > ns {231return Node{}, types.ERR_EOF232}233t := switchRawType(self.s[start])234if t == _V_NONE {235return Node{}, types.ERR_INVALID_CHAR236}237val = newRawNode(self.s[start:self.p], t)238} else {239/* decode the value */240if val, err = self.Parse(); err != 0 {241return Node{}, err242}243}244
245/* add the value to result */246// FIXME: ret's address may change here, thus previous referred node in ret may be invalid !!247ret.Add(Pair{Key: key, Value: val})248self.p = self.lspace(self.p)249
250/* check for EOF */251if self.p >= ns {252return Node{}, types.ERR_EOF253}254
255/* check for the next character */256switch self.s[self.p] {257case ',' : self.p++258case '}' : self.p++; return newObject(ret), 0259default:260// if val.isLazy() {261// return newLazyObject(self, ret), 0262// }263return Node{}, types.ERR_INVALID_CHAR264}265}266}
267
268func (self *Parser) decodeString(iv int64, ep int) (Node, types.ParsingError) {269p := self.p - 1270s := self.s[iv:p]271
272/* fast path: no escape sequence */273if ep == -1 {274return NewString(s), 0275}276
277/* unquote the string */278out, err := unquote(s)279
280/* check for errors */281if err != 0 {282return Node{}, err283} else {284return newBytes(rt.Str2Mem(out)), 0285}286}
287
288/** Parser Interface **/
289
290func (self *Parser) Pos() int {291return self.p292}
293
294func (self *Parser) Parse() (Node, types.ParsingError) {295switch val := self.decodeValue(); val.Vt {296case types.V_EOF : return Node{}, types.ERR_EOF297case types.V_NULL : return nullNode, 0298case types.V_TRUE : return trueNode, 0299case types.V_FALSE : return falseNode, 0300case types.V_STRING : return self.decodeString(val.Iv, val.Ep)301case types.V_ARRAY:302if p := skipBlank(self.s, self.p); p >= self.p && self.s[p] == ']' {303self.p = p + 1304return Node{t: types.V_ARRAY}, 0305}306if self.noLazy {307return self.decodeArray(new(linkedNodes))308}309return newLazyArray(self), 0310case types.V_OBJECT:311if p := skipBlank(self.s, self.p); p >= self.p && self.s[p] == '}' {312self.p = p + 1313return Node{t: types.V_OBJECT}, 0314}315if self.noLazy {316return self.decodeObject(new(linkedPairs))317}318return newLazyObject(self), 0319case types.V_DOUBLE : return NewNumber(self.s[val.Ep:self.p]), 0320case types.V_INTEGER : return NewNumber(self.s[val.Ep:self.p]), 0321default : return Node{}, types.ParsingError(-val.Vt)322}323}
324
325func (self *Parser) searchKey(match string) types.ParsingError {326ns := len(self.s)327if err := self.object(); err != 0 {328return err329}330
331/* check for EOF */332if self.p = self.lspace(self.p); self.p >= ns {333return types.ERR_EOF334}335
336/* check for empty object */337if self.s[self.p] == '}' {338self.p++339return _ERR_NOT_FOUND340}341
342var njs types.JsonState343var err types.ParsingError344/* decode each pair */345for {346
347/* decode the key */348if njs = self.decodeValue(); njs.Vt != types.V_STRING {349return types.ERR_INVALID_CHAR350}351
352/* extract the key */353idx := self.p - 1354key := self.s[njs.Iv:idx]355
356/* check for escape sequence */357if njs.Ep != -1 {358if key, err = unquote(key); err != 0 {359return err360}361}362
363/* expect a ':' delimiter */364if err = self.delim(); err != 0 {365return err366}367
368/* skip value */369if key != match {370if _, err = self.skipFast(); err != 0 {371return err372}373} else {374return 0375}376
377/* check for EOF */378self.p = self.lspace(self.p)379if self.p >= ns {380return types.ERR_EOF381}382
383/* check for the next character */384switch self.s[self.p] {385case ',':386self.p++387case '}':388self.p++389return _ERR_NOT_FOUND390default:391return types.ERR_INVALID_CHAR392}393}394}
395
396func (self *Parser) searchIndex(idx int) types.ParsingError {397ns := len(self.s)398if err := self.array(); err != 0 {399return err400}401
402/* check for EOF */403if self.p = self.lspace(self.p); self.p >= ns {404return types.ERR_EOF405}406
407/* check for empty array */408if self.s[self.p] == ']' {409self.p++410return _ERR_NOT_FOUND411}412
413var err types.ParsingError414/* allocate array space and parse every element */415for i := 0; i < idx; i++ {416
417/* decode the value */418if _, err = self.skipFast(); err != 0 {419return err420}421
422/* check for EOF */423self.p = self.lspace(self.p)424if self.p >= ns {425return types.ERR_EOF426}427
428/* check for the next character */429switch self.s[self.p] {430case ',':431self.p++432case ']':433self.p++434return _ERR_NOT_FOUND435default:436return types.ERR_INVALID_CHAR437}438}439
440return 0441}
442
443func (self *Node) skipNextNode() *Node {444if !self.isLazy() {445return nil446}447
448parser, stack := self.getParserAndArrayStack()449ret := &stack.v450sp := parser.p451ns := len(parser.s)452
453/* check for EOF */454if parser.p = parser.lspace(sp); parser.p >= ns {455return newSyntaxError(parser.syntaxError(types.ERR_EOF))456}457
458/* check for empty array */459if parser.s[parser.p] == ']' {460parser.p++461self.setArray(ret)462return nil463}464
465var val Node466/* skip the value */467if start, err := parser.skipFast(); err != 0 {468return newSyntaxError(parser.syntaxError(err))469} else {470t := switchRawType(parser.s[start])471if t == _V_NONE {472return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))473}474val = newRawNode(parser.s[start:parser.p], t)475}476
477/* add the value to result */478ret.Add(val)479self.l++480parser.p = parser.lspace(parser.p)481
482/* check for EOF */483if parser.p >= ns {484return newSyntaxError(parser.syntaxError(types.ERR_EOF))485}486
487/* check for the next character */488switch parser.s[parser.p] {489case ',':490parser.p++491return ret.At(ret.Len()-1)492case ']':493parser.p++494self.setArray(ret)495return ret.At(ret.Len()-1)496default:497return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))498}499}
500
501func (self *Node) skipNextPair() (*Pair) {502if !self.isLazy() {503return nil504}505
506parser, stack := self.getParserAndObjectStack()507ret := &stack.v508sp := parser.p509ns := len(parser.s)510
511/* check for EOF */512if parser.p = parser.lspace(sp); parser.p >= ns {513return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_EOF))}514}515
516/* check for empty object */517if parser.s[parser.p] == '}' {518parser.p++519self.setObject(ret)520return nil521}522
523/* decode one pair */524var val Node525var njs types.JsonState526var err types.ParsingError527
528/* decode the key */529if njs = parser.decodeValue(); njs.Vt != types.V_STRING {530return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}531}532
533/* extract the key */534idx := parser.p - 1535key := parser.s[njs.Iv:idx]536
537/* check for escape sequence */538if njs.Ep != -1 {539if key, err = unquote(key); err != 0 {540return &Pair{key, *newSyntaxError(parser.syntaxError(err))}541}542}543
544/* expect a ':' delimiter */545if err = parser.delim(); err != 0 {546return &Pair{key, *newSyntaxError(parser.syntaxError(err))}547}548
549/* skip the value */550if start, err := parser.skipFast(); err != 0 {551return &Pair{key, *newSyntaxError(parser.syntaxError(err))}552} else {553t := switchRawType(parser.s[start])554if t == _V_NONE {555return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}556}557val = newRawNode(parser.s[start:parser.p], t)558}559
560/* add the value to result */561ret.Add(Pair{Key: key, Value: val})562self.l++563parser.p = parser.lspace(parser.p)564
565/* check for EOF */566if parser.p >= ns {567return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_EOF))}568}569
570/* check for the next character */571switch parser.s[parser.p] {572case ',':573parser.p++574return ret.At(ret.Len()-1)575case '}':576parser.p++577self.setObject(ret)578return ret.At(ret.Len()-1)579default:580return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}581}582}
583
584
585/** Parser Factory **/
586
587// Loads parse all json into interface{}
588func Loads(src string) (int, interface{}, error) {589ps := &Parser{s: src}590np, err := ps.Parse()591
592/* check for errors */593if err != 0 {594return 0, nil, ps.ExportError(err)595} else {596x, err := np.Interface()597if err != nil {598return 0, nil, err599}600return ps.Pos(), x, nil601}602}
603
604// LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number
605func LoadsUseNumber(src string) (int, interface{}, error) {606ps := &Parser{s: src}607np, err := ps.Parse()608
609/* check for errors */610if err != 0 {611return 0, nil, err612} else {613x, err := np.InterfaceUseNumber()614if err != nil {615return 0, nil, err616}617return ps.Pos(), x, nil618}619}
620
621// NewParser returns pointer of new allocated parser
622func NewParser(src string) *Parser {623return &Parser{s: src}624}
625
626// NewParser returns new allocated parser
627func NewParserObj(src string) Parser {628return Parser{s: src}629}
630
631// decodeNumber controls if parser decodes the number values instead of skip them
632// WARN: once you set decodeNumber(true), please set decodeNumber(false) before you drop the parser
633// otherwise the memory CANNOT be reused
634func (self *Parser) decodeNumber(decode bool) {635if !decode && self.dbuf != nil {636types.FreeDbuf(self.dbuf)637self.dbuf = nil638return639}640if decode && self.dbuf == nil {641self.dbuf = types.NewDbuf()642}643}
644
645// ExportError converts types.ParsingError to std Error
646func (self *Parser) ExportError(err types.ParsingError) error {647if err == _ERR_NOT_FOUND {648return ErrNotExist649}650return fmt.Errorf("%q", SyntaxError{651Pos : self.p,652Src : self.s,653Code: err,654}.Description())655}
656