forked from cosmos/cosmos-sdk
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(x/bank): Replace regex parsing of denom validation to generated …
…parsing (cosmos#19511)
- Loading branch information
Showing
10 changed files
with
300 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
//line coin_regex.rl:1 | ||
// `coin_regex.go` is generated by regel using `ragel -Z coin_regex.rl`. | ||
// do not directly edit `coin_regex.go`. | ||
// source: types/coin_regex.rl | ||
// nolint:gocritic,unused,ineffassign | ||
|
||
// Regex parsing of denoms were as the following | ||
// reDnmString = `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}` | ||
// reDecAmt = `[[:digit:]]+(?:\.[[:digit:]]+)?|\.[[:digit:]]+` | ||
// reSpc = `[[:space:]]*` | ||
|
||
// reDnm = regexp.MustCompile(fmt.Sprintf(`^%s$`, coinDenomRegex())) | ||
// reDecCoin = regexp.MustCompile(fmt.Sprintf(`^(%s)%s(%s)$`, reDecAmt, reSpc, coinDenomRegex())) | ||
|
||
package types | ||
|
||
func MatchDenom(data []byte) bool { | ||
var _scanner_actions []byte = []byte{ | ||
0, 1, 0, | ||
} | ||
|
||
var _scanner_key_offsets []byte = []byte{ | ||
0, 0, 4, 11, | ||
} | ||
|
||
var _scanner_trans_keys []byte = []byte{ | ||
65, 90, 97, 122, 95, 45, 58, 65, | ||
90, 97, 122, | ||
} | ||
|
||
var _scanner_single_lengths []byte = []byte{ | ||
0, 0, 1, 0, | ||
} | ||
|
||
var _scanner_range_lengths []byte = []byte{ | ||
0, 2, 3, 0, | ||
} | ||
|
||
var _scanner_index_offsets []byte = []byte{ | ||
0, 0, 3, 8, | ||
} | ||
|
||
var _scanner_indicies []byte = []byte{ | ||
0, 0, 1, 2, 2, 2, 2, 1, | ||
1, | ||
} | ||
|
||
var _scanner_trans_targs []byte = []byte{ | ||
2, 0, 3, | ||
} | ||
|
||
var _scanner_trans_actions []byte = []byte{ | ||
0, 0, 1, | ||
} | ||
|
||
const scanner_start int = 1 | ||
const scanner_first_final int = 3 | ||
const scanner_error int = 0 | ||
|
||
const scanner_en_main int = 1 | ||
|
||
if len(data) < 3 || len(data) > 128 { | ||
return false | ||
} | ||
cs, p, pe, eof := 0, 0, len(data), len(data) | ||
_ = eof | ||
|
||
{ | ||
cs = scanner_start | ||
} | ||
|
||
{ | ||
var _klen int | ||
var _trans int | ||
var _acts int | ||
var _nacts uint | ||
var _keys int | ||
if p == pe { | ||
goto _test_eof | ||
} | ||
if cs == 0 { | ||
goto _out | ||
} | ||
_resume: | ||
_keys = int(_scanner_key_offsets[cs]) | ||
_trans = int(_scanner_index_offsets[cs]) | ||
|
||
_klen = int(_scanner_single_lengths[cs]) | ||
if _klen > 0 { | ||
_lower := int(_keys) | ||
var _mid int | ||
_upper := int(_keys + _klen - 1) | ||
for { | ||
if _upper < _lower { | ||
break | ||
} | ||
|
||
_mid = _lower + ((_upper - _lower) >> 1) | ||
switch { | ||
case data[p] < _scanner_trans_keys[_mid]: | ||
_upper = _mid - 1 | ||
case data[p] > _scanner_trans_keys[_mid]: | ||
_lower = _mid + 1 | ||
default: | ||
_trans += int(_mid - int(_keys)) | ||
goto _match | ||
} | ||
} | ||
_keys += _klen | ||
_trans += _klen | ||
} | ||
|
||
_klen = int(_scanner_range_lengths[cs]) | ||
if _klen > 0 { | ||
_lower := int(_keys) | ||
var _mid int | ||
_upper := int(_keys + (_klen << 1) - 2) | ||
for { | ||
if _upper < _lower { | ||
break | ||
} | ||
|
||
_mid = _lower + (((_upper - _lower) >> 1) & ^1) | ||
switch { | ||
case data[p] < _scanner_trans_keys[_mid]: | ||
_upper = _mid - 2 | ||
case data[p] > _scanner_trans_keys[_mid+1]: | ||
_lower = _mid + 2 | ||
default: | ||
_trans += int((_mid - int(_keys)) >> 1) | ||
goto _match | ||
} | ||
} | ||
_trans += _klen | ||
} | ||
|
||
_match: | ||
_trans = int(_scanner_indicies[_trans]) | ||
cs = int(_scanner_trans_targs[_trans]) | ||
|
||
if _scanner_trans_actions[_trans] == 0 { | ||
goto _again | ||
} | ||
|
||
_acts = int(_scanner_trans_actions[_trans]) | ||
_nacts = uint(_scanner_actions[_acts]) | ||
_acts++ | ||
for ; _nacts > 0; _nacts-- { | ||
_acts++ | ||
switch _scanner_actions[_acts-1] { | ||
case 0: | ||
return true | ||
} | ||
} | ||
|
||
_again: | ||
if cs == 0 { | ||
goto _out | ||
} | ||
p++ | ||
if p != pe { | ||
goto _resume | ||
} | ||
_test_eof: | ||
{ | ||
} | ||
_out: | ||
{ | ||
} | ||
} | ||
|
||
return false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// `coin_regex.go` is generated by regel using `ragel -Z coin_regex.rl`. | ||
// do not directly edit `coin_regex.go`. | ||
// source: types/coin_regex.rl | ||
// nolint:gocritic,unused,ineffassign | ||
|
||
|
||
// Regex parsing of denoms were as the following | ||
// reDnmString = `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}` | ||
// reDecAmt = `[[:digit:]]+(?:\.[[:digit:]]+)?|\.[[:digit:]]+` | ||
// reSpc = `[[:space:]]*` | ||
|
||
// reDnm = regexp.MustCompile(fmt.Sprintf(`^%s$`, coinDenomRegex())) | ||
// reDecCoin = regexp.MustCompile(fmt.Sprintf(`^(%s)%s(%s)$`, reDecAmt, reSpc, coinDenomRegex())) | ||
|
||
package types | ||
|
||
func MatchDenom(data []byte) bool { | ||
%% machine scanner; | ||
%% write data; | ||
|
||
if len(data) < 3 || len(data) > 128 { | ||
return false | ||
} | ||
cs, p, pe, eof := 0, 0, len(data), len(data) | ||
_ = eof | ||
%%{ | ||
# Define character classes | ||
special = '/' | ':' | '.' | '_' | '-'; | ||
|
||
denom_pattern = [a-zA-Z] (alnum | special); | ||
|
||
|
||
# Combined pattern for matching either a denomination or a decimal amount | ||
main := denom_pattern @{ return true }; | ||
|
||
write init; | ||
write exec; | ||
}%% | ||
return false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.