blob: c2d3ab3ff0f6020a8aba1f44cdb76504715dab1a [file] [log] [blame]
// Copyright (c) 2023, 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_enum.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;
switch (state) {
case State.start:
state = zero ? State.a1 : State.extended1;
break;
// 0xxxxxxx
// ^
case State.a1:
state = State.a2;
break;
case State.a2:
state = State.a3;
break;
case State.a3:
state = State.a4;
break;
case State.a4:
state = State.a5;
break;
case State.a5:
state = State.a6;
break;
case State.a6:
state = State.a7;
break;
case State.a7:
state = State.start;
break;
case State.error:
break OUTER;
// 110xxxxx 10xxxxxx
// ^
// 1110xxxx 10xxxxxx 10xxxxxx
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
case State.extended1:
state = zero ? State.error : State.extended2;
break;
case State.extended2:
state = zero ? State.two3 : State.extended3;
break;
case State.extended3:
state = zero ? State.three4 : State.extended4;
break;
case State.extended4:
state = zero ? State.four5 : State.error;
break;
case State.two3:
state = State.two4;
break;
case State.two4:
state = State.two5;
break;
case State.two5:
state = State.two6;
break;
case State.two6:
state = State.two7;
break;
case State.two7:
state = State.last0;
break;
case State.three4:
state = State.three5;
break;
case State.three5:
state = State.three6;
break;
case State.three6:
state = State.three7;
break;
case State.three7:
state = State.prev0;
break;
case State.four5:
state = State.four6;
break;
case State.four6:
state = State.four7;
break;
case State.four7:
state = State.first0;
break;
// 10xxxxxx 10xxxxxx 10xxxxxx
case State.first0:
state = zero ? State.error : State.first1;
break;
case State.first1:
state = zero ? State.first2 : State.error;
break;
case State.first2:
state = State.first3;
break;
case State.first3:
state = State.first4;
break;
case State.first4:
state = State.first5;
break;
case State.first5:
state = State.first6;
break;
case State.first6:
state = State.first7;
break;
case State.first7:
state = State.prev0;
break;
// 10xxxxxx 10xxxxxx
case State.prev0:
state = zero ? State.error : State.prev1;
break;
case State.prev1:
state = zero ? State.prev2 : State.error;
break;
case State.prev2:
state = State.prev3;
break;
case State.prev3:
state = State.prev4;
break;
case State.prev4:
state = State.prev5;
break;
case State.prev5:
state = State.prev6;
break;
case State.prev6:
state = State.prev7;
break;
case State.prev7:
state = State.last0;
break;
// 10xxxxxx
case State.last0:
state = zero ? State.error : State.last1;
break;
case State.last1:
state = zero ? State.last2 : State.error;
break;
case State.last2:
state = State.last3;
break;
case State.last3:
state = State.last4;
break;
case State.last4:
state = State.last5;
break;
case State.last5:
state = State.last6;
break;
case State.last6:
state = State.last7;
break;
case State.last7:
state = State.start;
break;
}
}
return state == State.start;
}