github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/iter_skip_strict.go (about)

     1  //go:build !jsoniter_sloppy
     2  // +build !jsoniter_sloppy
     3  
     4  package jsoni
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  )
    10  
    11  func (iter *Iterator) skipNumber() {
    12  	if !iter.trySkipNumber() {
    13  		iter.unreadByte()
    14  		if iter.Error != nil && iter.Error != io.EOF {
    15  			return
    16  		}
    17  		iter.ReadFloat64()
    18  		if iter.Error != nil && iter.Error != io.EOF {
    19  			iter.Error = nil
    20  			iter.ReadBigFloat()
    21  		}
    22  	}
    23  }
    24  
    25  func (iter *Iterator) trySkipNumber() bool {
    26  	dotFound := false
    27  	for i := iter.head; i < iter.tail; i++ {
    28  		c := iter.buf[i]
    29  		switch c {
    30  		case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
    31  		case '.':
    32  			if dotFound {
    33  				iter.ReportError("validateNumber", `more than one dot found in number`)
    34  				return true // already failed
    35  			}
    36  			if i+1 == iter.tail {
    37  				return false
    38  			}
    39  			c = iter.buf[i+1]
    40  			switch c {
    41  			case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
    42  			default:
    43  				iter.ReportError("validateNumber", `missing digit after dot`)
    44  				return true // already failed
    45  			}
    46  			dotFound = true
    47  		default:
    48  			switch c {
    49  			case ',', ']', '}', ' ', '\t', '\n', '\r':
    50  				if iter.head == i {
    51  					return false // if - without following digits
    52  				}
    53  				iter.head = i
    54  				return true // must be valid
    55  			}
    56  			return false // may be invalid
    57  		}
    58  	}
    59  	return false
    60  }
    61  
    62  func (iter *Iterator) skipString() {
    63  	if !iter.trySkipString() {
    64  		iter.unreadByte()
    65  		iter.ReadString()
    66  	}
    67  }
    68  
    69  func (iter *Iterator) trySkipString() bool {
    70  	for i := iter.head; i < iter.tail; i++ {
    71  		c := iter.buf[i]
    72  		if c == '"' {
    73  			iter.head = i + 1
    74  			return true // valid
    75  		} else if c == '\\' {
    76  			return false
    77  		} else if c < ' ' {
    78  			iter.ReportError("trySkipString",
    79  				fmt.Sprintf(`invalid control character found: %d`, c))
    80  			return true // already failed
    81  		}
    82  	}
    83  	return false
    84  }
    85  
    86  func (iter *Iterator) skipObject() {
    87  	iter.unreadByte()
    88  	iter.ReadObjectCB(func(iter *Iterator, field string) bool {
    89  		iter.Skip()
    90  		return true
    91  	})
    92  }
    93  
    94  func (iter *Iterator) skipArray() {
    95  	iter.unreadByte()
    96  	iter.ReadArrayCB(func(iter *Iterator) bool {
    97  		iter.Skip()
    98  		return true
    99  	})
   100  }