+iec16022 (0.2.4-1.2) unstable; urgency=medium
+
+ * Non-maintainer upload.
+ * Cherry-pick from upstream:
+ - Fix EDIFACT encoding (0f2adb)
+ (Closes: #773719)
+ - Fix encoding of _. (45813a)
+ (Closes: #429210)
+ - Fix cases where data might be lost. (ebbb6e2)
+ (Closes: #835296)
+
+ -- Jakob Haufe <sur5r@sur5r.net> Sun, 19 Feb 2017 00:00:24 +0100
+
iec16022 (0.2.4-1.1) unstable; urgency=low
* Non-maintainer upload.
{
char out[6], p = 0;
const char *e,
- *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]_",
+ *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]^_",
*s3 = 0;
if (newenc == 'c') {
e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}
}
}
- if (p == 2 && tp + 2 == tl && sp == sl)
- out[p++] = 0; // shift 1 pad at end
- while (p >= 3) {
- int v =
- out[0] * 1600 +
+ while (p >= 3 || (p && sp == sl)) {
+ int v;
+ while (p < 3) out[p++] = 0; // pad at end
+ if (tp + 2 >= tl) return 0; // not enough space
+ v = out[0] * 1600 +
out[1] * 40 + out[2] + 1;
if (enc != newenc) {
if (enc == 'c'
case 'e': // EDIFACT
{
unsigned char out[4], p = 0;
- if (enc != newenc) { // can only be from C40/Text/X12
+ if (enc != 'a' && enc != newenc) { // can only be from C40/Text/X12
t[tp++] = 254;
enc = 'a';
}
+ if (enc == 'a')
+ {
+ t[tp++] = 240;
+ enc = 'e';
+ }
while (sp < sl && tolower(encoding[sp]) == 'e'
- && p < 4)
+ && p < 4) {
+ if (s[sp] < 32 || s[sp] > 94) {
+ fprintf(stderr, "Cannot encode 0x%02X in EDIFACT\n", s[sp]);
+ return 0;
+ }
out[p++] = s[sp++];
+ }
if (p < 4) {
out[p++] = 0x1F;
enc = 'a';
} // termination
- t[tp] = ((s[0] & 0x3F) << 2);
- t[tp++] |= ((s[1] & 0x30) >> 4);
- t[tp] = ((s[1] & 0x0F) << 4);
+ t[tp] = ((out[0] & 0x3F) << 2);
+ t[tp++] |= ((out[1] & 0x30) >> 4);
+ t[tp] = ((out[1] & 0x0F) << 4);
if (p == 2)
tp++;
else {
- t[tp++] |= ((s[2] & 0x3C) >> 2);
- t[tp] = ((s[2] & 0x03) << 6);
- t[tp++] |= (s[3] & 0x3F);
+ t[tp++] |= ((out[2] & 0x3C) >> 2);
+ t[tp] = ((out[2] & 0x03) << 6);
+ t[tp++] |= (out[3] & 0x3F);
}
}
break;
t[tp] = s[sp++] + (((tp + 1) * 149) % 255) + 1; // see annex H
tp++;
}
+ if (l) return 0; // not enough space
enc = 'a'; // reverse to ASCII at end
}
break;