decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

Implementation

U1DResult? decodeRow(UBitArray row) {
  final List<int>? startRange = UUpcEanReader._findStartGuardPattern(row);
  if (startRange == null) return null;
  final StringBuffer result = StringBuffer();
  final Int32List counters = Int32List(4);
  int rowOffset = startRange[1];
  int lgPatternFound = 0;

  try {
    for (int x = 0; x < 6; x++) {
      final int bestMatch = UUpcEanReader._decodeDigit(row, counters, rowOffset, UUpcEanPatterns.lAndGPatterns);
      result.writeCharCode(48 + bestMatch % 10);
      for (final int counter in counters) {
        rowOffset += counter;
      }
      if (bestMatch >= 10) lgPatternFound |= 1 << (5 - x);
    }
  } catch (_) {
    return null;
  }

  int numSys = -1;
  for (int system = 0; system <= 1; system++) {
    for (int digit = 0; digit < 10; digit++) {
      if (lgPatternFound == UUpcEanPatterns.numsysAndCheckDigit[system][digit]) {
        numSys = system;
        break;
      }
    }
    if (numSys >= 0) break;
  }
  if (numSys < 0) return null;

  final List<int>? endRange = UUpcEanReader._findGuardPattern(row, rowOffset, true, UUpcEanPatterns.endPattern);
  if (endRange == null) return null;

  final String compressed = "$numSys${result.toString()}";
  final String expanded = _expand(compressed);
  if (expanded.isEmpty) return null;
  final String full = expanded + _checkDigit(expanded);
  if (!UUpcEanPatterns.checksum(full)) return null;
  return U1DResult(UCodeFormat.upcE, "$compressed${_checkDigit(expanded)}", startRange[0].toDouble(), endRange[1].toDouble());
}