Skip to content

Commit

Permalink
Merge pull request #32 from tdakkota/fix/skip-space-in-bool-decode
Browse files Browse the repository at this point in the history
fix: skip space if needed, when decoding bool/null
  • Loading branch information
ernado committed Jan 24, 2022
2 parents c929480 + 73c28bb commit c8ebbd1
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 67 deletions.
4 changes: 4 additions & 0 deletions dec_bool.go
Expand Up @@ -2,6 +2,10 @@ package jx

// Bool reads a json object as Bool
func (d *Decoder) Bool() (bool, error) {
if err := d.skipSpace(); err != nil {
return false, err
}

var buf [4]byte
if err := d.readExact4(&buf); err != nil {
return false, err
Expand Down
4 changes: 4 additions & 0 deletions dec_null.go
Expand Up @@ -3,6 +3,10 @@ package jx
// Null reads a json object as null and
// returns whether it's a null or not.
func (d *Decoder) Null() error {
if err := d.skipSpace(); err != nil {
return err
}

var buf [4]byte
if err := d.readExact4(&buf); err != nil {
return err
Expand Down
12 changes: 12 additions & 0 deletions dec_skip.go
Expand Up @@ -458,3 +458,15 @@ func (d *Decoder) skipArr() error {
}
}
}

// skipSpace skips space characters.
//
// Returns io.ErrUnexpectedEOF if got io.EOF.
func (d *Decoder) skipSpace() error {
// Skip space.
if _, err := d.more(); err != nil {
return err
}
d.unread()
return nil
}
146 changes: 79 additions & 67 deletions dec_skip_cases_test.go
Expand Up @@ -22,76 +22,88 @@ var testBools = []string{
"nope",
"true",
"false",
" true",
" false",
"\ntrue",
"\nfalse",
"\ttrue",
"\tfalse",
}

var testNumbers = []string{
"", // invalid
"0", // valid
"-", // invalid
"--", // invalid
"+", // invalid
".", // invalid
"e", // invalid
"E", // invalid
"-.", // invalid
"-1", // valid
"--1", // invalid
"+1", // invalid
"++1", // invalid
"-a", // invalid
"-0", // valid
"00", // invalid
"01", // invalid
".00", // invalid
"00.1", // invalid
"-00", // invalid
"-01", // invalid
"-\x00", // invalid, zero byte
"0.1", // valid
"0e1", // valid
"0e+1", // valid
"0e-1", // valid
"0e-11", // valid
"0e-1a", // invalid
"1.e1", // invalid
"0e-1+", // invalid
"0e", // invalid
"e", // invalid
"-e", // invalid
"+e", // invalid
".e", // invalid
"e.", // invalid
"0.e", // invalid
"0-e", // invalid
"0e-", // invalid
"0e+", // invalid
"0.0e", // invalid
"0.0e1", // valid
"0.0e+", // invalid
"0.0e-", // invalid
"0e0+0", // invalid
"0.e0+0", // invalid
"0.0e+0", // valid
"0.0e+1", // valid
"0.0e0+0", // invalid
"0.", // invalid
"1.", // invalid
"0..1", // invalid, more dot
"1e+1", // valid
"1+1", // invalid
"1E1", // valid, e or E
"1ee1", // invalid
"100a", // invalid
"10.", // invalid
"-0.12", // valid
"0]", // invalid
"0e]", // invalid
"0e+]", // invalid
"1.2.3", // invalid
"0.0.0", // invalid
"9223372036854775807", // valid
"9223372036854775808", // valid
"9223372036854775807.1", // valid
"", // invalid
"0", // valid
"-", // invalid
"--", // invalid
"+", // invalid
".", // invalid
"e", // invalid
"E", // invalid
"-.", // invalid
"-1", // valid
"--1", // invalid
"+1", // invalid
"++1", // invalid
"-a", // invalid
"-0", // valid
"00", // invalid
"01", // invalid
".00", // invalid
"00.1", // invalid
"-00", // invalid
"-01", // invalid
"-\x00", // invalid, zero byte
"0.1", // valid
"0e1", // valid
"0e+1", // valid
"0e-1", // valid
"0e-11", // valid
"0e-1a", // invalid
"1.e1", // invalid
"0e-1+", // invalid
"0e", // invalid
"e", // invalid
"-e", // invalid
"+e", // invalid
".e", // invalid
"e.", // invalid
"0.e", // invalid
"0-e", // invalid
"0e-", // invalid
"0e+", // invalid
"0.0e", // invalid
"0.0e1", // valid
"0.0e+", // invalid
"0.0e-", // invalid
"0e0+0", // invalid
"0.e0+0", // invalid
"0.0e+0", // valid
"0.0e+1", // valid
"0.0e0+0", // invalid
"0.", // invalid
"1.", // invalid
"0..1", // invalid, more dot
"1e+1", // valid
"1+1", // invalid
"1E1", // valid, e or E
"1ee1", // invalid
"100a", // invalid
"10.", // invalid
"-0.12", // valid
"0]", // invalid
"0e]", // invalid
"0e+]", // invalid
"1.2.3", // invalid
"0.0.0", // invalid
"9223372036854775807", // valid
"9223372036854775808", // valid
"9223372036854775807.1", // valid
" 9223372036854775807", // valid
" 9223372036854775808", // valid
" 9223372036854775807.1", // valid
"\n9223372036854775807", // valid
"\n9223372036854775808", // valid
"\n9223372036854775807.1", // valid
}

var testStrings = append([]string{
Expand Down
4 changes: 4 additions & 0 deletions null_test.go
Expand Up @@ -59,6 +59,10 @@ func TestNullError(t *testing.T) {
if valid[i] == c {
continue
}
// Skip space as first character.
if i == 0 && spaceSet[c] == 1 {
continue
}
b[i] = c
var token badTokenErr
a.ErrorAs(DecodeBytes(b[:]).Null(), &token)
Expand Down

0 comments on commit c8ebbd1

Please sign in to comment.