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);
break;
}
}
return -1;
}