blob: b63f5b3c895a6cf87ec0cb8a34fcefe03879b7ef [file] [edit]
// 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;
}