| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'dart:typed_data'; | |
| import 'state_int.dart'; | |
| bool match(Uint8List s) { | |
| int i = 0; | |
| var state = State.start; | |
| OUTER: | |
| while (true) { | |
| if (i == s.length) break; | |
| final zero = s[i++] == 48; | |
| state = switch (state) { | |
| State.start => zero ? State.a1 : State.extended1, | |
| // 0xxxxxxx | |
| // ^ | |
| State.a1 => State.a2, | |
| State.a2 => State.a3, | |
| State.a3 => State.a4, | |
| State.a4 => State.a5, | |
| State.a5 => State.a6, | |
| State.a6 => State.a7, | |
| State.a7 => State.start, | |
| State.error => -1, | |
| // 110xxxxx 10xxxxxx | |
| // ^ | |
| // 1110xxxx 10xxxxxx 10xxxxxx | |
| // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | |
| State.extended1 => zero ? State.error : State.extended2, | |
| State.extended2 => zero ? State.two3 : State.extended3, | |
| State.extended3 => zero ? State.three4 : State.extended4, | |
| State.extended4 => zero ? State.four5 : State.error, | |
| State.two3 => State.two4, | |
| State.two4 => State.two5, | |
| State.two5 => State.two6, | |
| State.two6 => State.two7, | |
| State.two7 => State.last0, | |
| State.three4 => State.three5, | |
| State.three5 => State.three6, | |
| State.three6 => State.three7, | |
| State.three7 => State.prev0, | |
| State.four5 => State.four6, | |
| State.four6 => State.four7, | |
| State.four7 => State.first0, | |
| // 10xxxxxx 10xxxxxx 10xxxxxx | |
| State.first0 => zero ? State.error : State.first1, | |
| State.first1 => zero ? State.first2 : State.error, | |
| State.first2 => State.first3, | |
| State.first3 => State.first4, | |
| State.first4 => State.first5, | |
| State.first5 => State.first6, | |
| State.first6 => State.first7, | |
| State.first7 => State.prev0, | |
| // 10xxxxxx 10xxxxxx | |
| State.prev0 => zero ? State.error : State.prev1, | |
| State.prev1 => zero ? State.prev2 : State.error, | |
| State.prev2 => State.prev3, | |
| State.prev3 => State.prev4, | |
| State.prev4 => State.prev5, | |
| State.prev5 => State.prev6, | |
| State.prev6 => State.prev7, | |
| State.prev7 => State.last0, | |
| // 10xxxxxx | |
| State.last0 => zero ? State.error : State.last1, | |
| State.last1 => zero ? State.last2 : State.error, | |
| State.last2 => State.last3, | |
| State.last3 => State.last4, | |
| State.last4 => State.last5, | |
| State.last5 => State.last6, | |
| State.last6 => State.last7, | |
| State.last7 => State.start, | |
| _ => -1, | |
| }; | |
| if (state == -1) break OUTER; | |
| } | |
| return state == State.start; | |
| } |