shortestCode method

Iterable<int> shortestCode(
  1. List<int> data
)

Implementation

Iterable<int> shortestCode(List<int> data) {
  int table = 0;

  int lastTable = 0;

  int length = 0;
  int digitCount = 0;

  final List<int> result = <int>[];

  void addFrom(List<int> data, int start) {
    Map<int, int>? t;
    if (table & 4 != 0 && digitCount & 1 == 0) {
      t = BarcodeMaps.code128C;
      if (lastTable == 1) {
        result.add(t[BarcodeMaps.code128CodeA]!);
      } else if (lastTable == 2) {
        result.add(t[BarcodeMaps.code128CodeB]!);
      }
      lastTable = 3;
    } else if (table & 1 != 0) {
      t = BarcodeMaps.code128A;
      if (lastTable == 2) {
        result.add(t[BarcodeMaps.code128CodeB]!);
      } else if (lastTable == 3) {
        result.add(t[BarcodeMaps.code128CodeC]!);
      }
      lastTable = 1;
    } else if (table & 2 != 0) {
      t = BarcodeMaps.code128B;
      if (lastTable == 1) {
        result.add(t[BarcodeMaps.code128CodeA]!);
      } else if (lastTable == 3) {
        result.add(t[BarcodeMaps.code128CodeC]!);
      }
      lastTable = 2;
    }

    if (t == null) {
      throw BarcodeException('Unable to encode "${String.fromCharCodes(data)}" to $name Barcode');
    }

    if (lastTable == 3) {
      for (int i = start + length - 1; i >= start; i--) {
        if (data[i] == BarcodeMaps.code128FNC1) {
          result.add(t[BarcodeMaps.code128FNC1]!);
        } else {
          final int digit = data[i] - 0x30 + (data[i - 1] - 0x30) * 10;
          assert(t[digit] != null);
          result.add(t[digit]!);
          i--;
        }
      }
    } else {
      for (final int c in data.sublist(start, start + length).reversed) {
        assert(t[c] != null);
        result.add(t[c]!);
      }
    }
  }

  for (int index = data.length - 1; index >= 0; index--) {
    final int code = data[index];

    final bool codeA = useCode128A && BarcodeMaps.code128A.containsKey(code);
    final bool codeB = useCode128B && BarcodeMaps.code128B.containsKey(code);
    final bool isFnc1 = code == BarcodeMaps.code128FNC1;
    final bool codeC = useCode128C && (code >= 0x30 && code <= 0x39);

    int available = 0;
    if (codeA) {
      available = 1;
    }
    if (codeB) {
      available |= 2;
    }
    if (codeC || isFnc1) {
      available |= 4;
    }

    if (available == 0) {
      throw BarcodeException('Unable to encode "${String.fromCharCode(code)}" to $name Barcode');
    }

    if (codeC) {
      digitCount++;
    } else if (isFnc1) {
      length++;
      addFrom(data, index);
      length = 0;
      digitCount = 0;
      continue;
    } else {
      if (digitCount >= 4) {
        if (digitCount & 1 != 0) {
          digitCount--;
        } else {}
        if (length > digitCount) {
          length -= digitCount;

          table &= 3;
          if (table == 0) {
            throw BarcodeException('Unable to encode "${String.fromCharCodes(data)}" to $name Barcode');
          }
          addFrom(data, index + digitCount + 1);
          length = digitCount;
        }

        table = 4;
        addFrom(data, index + 1);
        table = 0;
        length = 0;
      }
      digitCount = 0;
    }

    if (table == 0) {
      table = available;
      length++;
    } else {
      final int newTable = table & available;
      if (newTable == 0) {
        addFrom(data, index + 1);
        length = 0;
        table = available;
      } else {
        table = newTable;
      }
      length++;
    }
  }

  if (digitCount >= 2) {
    if (digitCount & 1 != 0) {
      length -= digitCount - 1;
      addFrom(data, digitCount - 1);
      digitCount--;
    } else if (length > digitCount) {
      length -= digitCount;
      addFrom(data, digitCount);
    }
    table = 4;
    length = digitCount;
  }
  if (length > 0) {
    addFrom(data, 0);
  }

  if (lastTable == 1) {
    result.add(BarcodeMaps.code128StartCodeA);
  } else if (lastTable == 2) {
    result.add(BarcodeMaps.code128StartCodeB);
  } else if (lastTable == 3) {
    result.add(BarcodeMaps.code128StartCodeC);
  }

  return result.reversed;
}