]> git.sur5r.net Git - iec16022/commitdiff
Import Debian changes 0.2.4-1.2 master debian/0.2.4-1.2
authorJakob Haufe <sur5r@sur5r.net>
Sat, 18 Feb 2017 23:00:24 +0000 (00:00 +0100)
committerJakob Haufe <sur5r@sur5r.net>
Wed, 22 Feb 2017 00:30:16 +0000 (01:30 +0100)
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)

debian/changelog
iec16022ecc200.c

index c493407126630685c5bbc8696bece6407e4a29e9..0702133b09c1eb437c89c6f79718b50a7a0321f3 100644 (file)
@@ -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 <sur5r@sur5r.net>  Sun, 19 Feb 2017 00:00:24 +0100
+
 iec16022 (0.2.4-1.1) unstable; urgency=low
 
   * Non-maintainer upload.
index 5afcf0752fe25ac6a7c5a748ae25f9ee122a16c2..57405db48287acb7d077dafb2b442c04e37d9388 100644 (file)
@@ -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;