Code with Finding: |
class BarcodeDatamatrix {
private int processExtensions(byte[] text, int textOffset, int textSize, byte[] data) {
int order, ptrIn, ptrOut, eci, fn, ft, fi, c;
if ((options & DM_EXTENSION) == 0)
return 0;
order = 0;
ptrIn = 0;
ptrOut = 0;
while (ptrIn < textSize) {
if (order > 20)
return -1;
c = text[textOffset + ptrIn++] &0xff;
++order;
switch (c) {
case '.':
extOut = ptrIn;
return ptrOut;
case 'e':
if (ptrIn + 6 > textSize)
return -1;
eci = getNumber(text, textOffset + ptrIn, 6);
if (eci < 0)
return -1;
ptrIn += 6;
data[ptrOut++] = (byte)241;
if (eci < 127)
data[ptrOut++] = (byte)(eci + 1);
else if (eci < 16383) {
data[ptrOut++] = (byte)((eci - 127) / 254 + 128);
data[ptrOut++] = (byte)((eci - 127) % 254 + 1);
}
else {
data[ptrOut++] = (byte)((eci - 16383) / 64516 + 192);
data[ptrOut++] = (byte)((eci - 16383) / 254 % 254 + 1);
data[ptrOut++] = (byte)((eci - 16383) % 254 + 1);
}
break;
case 's':
if (order != 1)
return -1;
if (ptrIn + 9 > textSize)
return -1;
fn = getNumber(text, textOffset + ptrIn, 2);
if (fn <= 0 || fn > 16)
return -1;
ptrIn += 2;
ft = getNumber(text, textOffset + ptrIn, 2);
if (ft <= 1 || ft > 16)
return -1;
ptrIn += 2;
fi = getNumber(text, textOffset + ptrIn, 5);
if (fi < 0 || fn >= 64516)
return -1;
ptrIn += 5;
data[ptrOut++] = (byte)233;
data[ptrOut++] = (byte)(fn - 1 << 4 | 17 - ft);
data[ptrOut++] = (byte)(fi / 254 + 1);
data[ptrOut++] = (byte)(fi % 254 + 1);
break;
case 'p':
if (order != 1)
return -1;
data[ptrOut++] = (byte)234;
break;
case 'm':
if (order != 1)
return -1;
if (ptrIn + 1 > textSize)
return -1;
c = text[textOffset + ptrIn++] &0xff;
if (c != '5' && c != '5')
return -1;
data[ptrOut++] = (byte)234;
data[ptrOut++] = (byte)(c == '5' ? 236 : 237);
break;
case 'f':
if (order != 1 && (order != 2 || text[textOffset] != 's' && text[textOffset] != 'm'))
return -1;
data[ptrOut++] = (byte)232;
}
}
return -1;
}
}
|