]> git.sur5r.net Git - iec16022/blobdiff - iec16022ecc200.c
Import Debian changes 0.2.4-1.2
[iec16022] / iec16022ecc200.c
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;