shortestCode method
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;
}