📄 iec16022ecc200.cs
字号:
return (char)0; // did not fit
/*
* for (tp = 0; tp < tl; tp++) fprintf (stderr, "%02X ", t[tp]); \
* fprintf (stderr, "\n");
*/
return (char)1; // OK
}
private byte[] encmake(int l, byte[] s, ref int lenp, char exact)
{
int p = l;
char e;
TempStruct1[,] enc = new TempStruct1[MAXBARCODE, (int)EncType.E_MAX];
//memset(&enc, 0, sizeof(enc));
if (!(l != 0))
return null; // no length
if (l > MAXBARCODE)
return null; // not valid
while ((p--) > 0)
{
char b = (char)0;
char sub;
int sl, tl, bl, t;
// consider each encoding from this point
// ASCII
sl = tl = 1;
if (isdigit(s[p]) && p + 1 < l && isdigit(s[p + 1]))
sl = 2; // double digit
else if ((s[p] & 0x80) != 0)
tl = 2; // high shifted
bl = 0;
if (p + sl < l)
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if ((enc[p + sl, e].t != 0) && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0)))
{
bl = t;
b = e;
}
enc[p, (int)EncType.E_ASCII].t = (short)(tl + bl);
enc[p, (int)EncType.E_ASCII].s = (short)sl;
if ((bl != 0) && b == (int)EncType.E_ASCII)
enc[p, b].s += enc[p + sl, b].s;
// C40
sub = (char)0;
tl = 0;
sl = 0;
do
{
byte c = s[p + sl++];
if ((c & 0x80) != 0)
{ // shift + upper
sub += (char)2;
c &= 0x7F;
}
if (c != ' ' && !isdigit(c) && !isupper(c))
sub++; // shift
sub++;
while (sub >= 3)
{
sub -= (char)3;
tl += 2;
}
} while ((sub != 0) && (p + sl < l));
if ((exact != 0) && sub == 2 && p + sl == l)
{
// special case, can encode last block with shift 0 at end (Is this
// valid when not end of target buffer?)
sub = (char)0;
tl += 2;
}
if (!(sub != 0))
{ // can encode C40
bl = 0;
if (p + sl < l)
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if ((enc[p + sl, e].t != 0) && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_C40, e]) < bl || !(bl != 0)))
{
bl = t;
b = e;
}
if ((exact != 0) && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
{
// special case, switch to ASCII for last bytes
bl = 1;
b = (char)EncType.E_ASCII;
}
enc[p, (int)EncType.E_C40].t = (short)(tl + bl);
enc[p, (int)EncType.E_C40].s = (short)sl;
if (bl != 0 && b == (int)EncType.E_C40)
enc[p, b].s += enc[p + sl, b].s;
}
// Text
sub = (char)0;
tl = 0;
sl = 0;
do
{
byte c = s[p + sl++];
if ((c & 0x80) != 0)
{ // shift + upper
sub += (char)2;
c &= 0x7F;
}
if (c != ' ' && !isdigit(c) && !islower(c))
sub++; // shift
sub++;
while (sub >= 3)
{
sub -= (char)3;
tl += 2;
}
} while (sub != 0 && (p + sl < l));
if (exact != 0 && sub == 2 && p + sl == l)
{
// special case, can encode last block with shift 0 at end (Is this
// valid when not end of target buffer?)
sub = (char)0;
tl += 2;
}
if (!(sub != 0) && (sl != 0))
{ // can encode Text
bl = 0;
if (p + sl < l)
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if (enc[p + sl, e].t != 0
&&
((t =
enc[p + sl, e].t +
switchcost[(int)EncType.E_TEXT, e]) < bl
|| !(bl != 0)))
{
bl = t;
b = e;
}
if (exact != 0 && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
{ // special case, switch to ASCII for last bytes
bl = 1;
b = (char)EncType.E_ASCII;
}
enc[p, (int)EncType.E_TEXT].t = (short)(tl + bl);
enc[p, (int)EncType.E_TEXT].s = (short)sl;
if (bl != 0 && b == (int)EncType.E_TEXT)
enc[p, b].s += enc[p + sl, b].s;
}
// X12
sub = (char)0;
tl = 0;
sl = 0;
do
{
byte c = s[p + sl++];
if (c != 13 && c != '*' && c != '>' && c != ' '
&& !isdigit(c) && !isupper(c))
{
sl = 0;
break;
}
sub++;
while (sub >= 3)
{
sub -= (char)3;
tl += 2;
}
} while (sub != 0 && p + sl < l);
if (!(sub != 0) && (sl != 0))
{ // can encode X12
bl = 0;
if (p + sl < l)
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if (enc[p + sl, e].t != 0 && ((t = enc[p + sl, e].t + switchcost[(int)EncType.E_X12, e]) < bl || !(bl != 0)))
{
bl = t;
b = e;
}
if (exact != 0 && enc[p + sl, (int)EncType.E_ASCII].t == 1 && 1 < bl)
{
// special case, switch to ASCII for last bytes
bl = 1;
b = (char)EncType.E_ASCII;
}
enc[p, (int)EncType.E_X12].t = (short)(tl + bl);
enc[p, (int)EncType.E_X12].s = (short)sl;
if (bl != 0 && b == (int)EncType.E_X12)
enc[p, b].s += enc[p + sl, b].s;
}
// EDIFACT
sl = bl = 0;
if (s[p + 0] >= 32 && s[p + 0] <= 94)
{ // can encode 1
char bs = (char)0;
if (p + 1 == l && (!(bl != 0) || bl < 2))
{
bl = 2;
bs = (char)1;
}
else
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if (e != (int)EncType.E_EDIFACT && enc[p + 1, e].t != 0 && ((t = 2 + enc[p + 1, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0))) // E_ASCII as allowed for unlatch
{
bs = (char)1;
bl = t;
b = e;
}
if (p + 1 < l && s[p + 1] >= 32 && s[p + 1] <= 94)
{ // can encode 2
if (p + 2 == l && (!(bl != 0) || bl < 2))
{
bl = 3;
bs = (char)2;
}
else
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if (e != (int)EncType.E_EDIFACT
&& enc[p + 2, e].t != 0
&&
((t =
3 + enc[p + 2, e].t +
switchcost[(int)EncType.E_ASCII, e])
< bl || !(bl != 0))) // E_ASCII as allowed for unlatch
{
bs = (char)2;
bl = t;
b = e;
}
if (p + 2 < l && s[p + 2] >= 32 && s[p + 2] <= 94)
{ // can encode 3
if (p + 3 == l && (!(bl != 0) || bl < 3))
{
bl = 3;
bs = (char)3;
}
else
for (e = (char)0; e < (int)EncType.E_MAX; e++)
if (e != (int)EncType.E_EDIFACT
&& enc[p + 3, e].t != 0
&& ((t = 3 + enc[p + 3, e].t + switchcost[(int)EncType.E_ASCII, e]) < bl || !(bl != 0))) // E_ASCII as allowed for unlatch
{
bs = (char)3;
bl = t;
b = e;
}
if (p + 4 < l && s[p + 3] >= 32 && s[p + 3] <= 94)
{ // can encode 4
if (p + 4 == l && (!(bl != 0) || bl < 3))
{
bl = 3;
bs = (char)4;
}
else
{
for (e = (char)0; e < (int)EncType.E_MAX;
e++)
if (enc[p + 4, e].t != 0 && ((t = 3 + enc[p + 4, e].t + switchcost[(int)EncType.E_EDIFACT, e]) < bl || !(bl != 0)))
{
bs = (char)4;
bl = t;
b = e;
}
if (exact != 0
&& enc[p + 4, (int)EncType.E_ASCII].t != 0
&& enc[p + 4, (int)EncType.E_ASCII].
t <= 2
&& (t = 3 + enc[p + 4, (int)EncType.E_ASCII].t) < bl)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -