From: Jakob Haufe Date: Sat, 18 Feb 2017 23:00:24 +0000 (+0100) Subject: Import Debian changes 0.2.4-1.2 X-Git-Tag: debian/0.2.4-1.2^0 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;ds=inline;p=iec16022 Import Debian changes 0.2.4-1.2 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) --- diff --git a/debian/changelog b/debian/changelog index c493407..0702133 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +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 Sun, 19 Feb 2017 00:00:24 +0100 + iec16022 (0.2.4-1.1) unstable; urgency=low * Non-maintainer upload. diff --git a/iec16022ecc200.c b/iec16022ecc200.c index 5afcf07..57405db 100644 --- a/iec16022ecc200.c +++ b/iec16022ecc200.c @@ -255,7 +255,7 @@ char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl, { char out[6], p = 0; const char *e, - *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]_", + *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]^_", *s3 = 0; if (newenc == 'c') { e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -321,11 +321,11 @@ char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl, } } } - 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' @@ -356,26 +356,36 @@ char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl, 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; @@ -420,6 +430,7 @@ char ecc200encode(unsigned char *t, int tl, unsigned char *s, int sl, 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;