]> err.no Git - sope/commitdiff
fixed underscore decoding in quoted printable
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 13 Dec 2005 15:41:27 +0000 (15:41 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 13 Dec 2005 15:41:27 +0000 (15:41 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1197 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-core/NGExtensions/ChangeLog
sope-core/NGExtensions/NGQuotedPrintableCoding.m
sope-core/NGExtensions/Version

index 2c7f35ae38f619bfe0c49a76a8cf6d19060ae021..b7ee72196239df6c854a5596286973950e886807 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-13  Helge Hess  <helge.hess@opengroupware.org>
+
+       * NGQuotedPrintableCoding.m (NGDecodeQuotedPrintable): properly decode
+         underscore as 0x20 (as per RFC 2047 4.2) (v4.5.180)
+
 2005-11-21  Helge Hess  <helge.hess@skyrix.com>
 
        * NGExtensions/NSObject+Values.h: added NGBaseTypeValues protocol to
index 2f9b1271a9da4c7324893a66e6953db8c8ae87ac..22780df013b127cfcf2d4f0522be9a236f249225 100644 (file)
@@ -99,7 +99,7 @@
 
 // implementation
 
-static inline char __hexToChar(char c) {
+static inline signed char __hexToChar(char c) {
   if ((c > 47) && (c < 58)) // '0' .. '9'
     return c - 48;
   if ((c > 64) && (c < 71)) // 'A' .. 'F'
@@ -110,7 +110,14 @@ static inline char __hexToChar(char c) {
 }
 
 int NGDecodeQuotedPrintable(const char *_src, unsigned _srcLen,
-                            char *_dest, unsigned _destLen) {
+                            char *_dest, unsigned _destLen)
+{
+  /*
+    Eg: "Hello=20World" => "Hello World"
+
+    =XY where XY is a hex encoded byte. In addition '_' is decoded as 0x20
+    (not as space!, this depends on the charset, see RFC 2047 4.2).
+  */
   unsigned cnt     = 0;
   unsigned destCnt = 0;
 
@@ -119,33 +126,38 @@ int NGDecodeQuotedPrintable(const char *_src, unsigned _srcLen,
 
   for (cnt = 0; ((cnt < _srcLen) && (destCnt < _destLen)); cnt++) {
     if (_src[cnt] != '=') {
-      _dest[destCnt++] = _src[cnt];
+      _dest[destCnt] = _src[cnt] == '_' ? 0x20 : _src[cnt];
+      destCnt++;
     }
     else {
       if ((_srcLen - cnt) > 1) {
         signed char c1, c2;
 
-        c1 = _src[++cnt];
-
+       cnt++;          // skip '='
+        c1 = _src[cnt]; // first hex digit
+       
         if (c1 == '\r' || c1 == '\n') {
-          if (_src[cnt+1] == '\r' || _src[cnt+1] == '\n' )
+          if (_src[cnt + 1] == '\r' || _src[cnt + 1] == '\n' )
             cnt++;
           continue;
         }
         c1 = __hexToChar(c1);
-        c2 = __hexToChar(_src[++cnt]);
+       
+       cnt++; // skip first hex digit
+        c2 = __hexToChar(_src[cnt]);
         
         if ((c1 == -1) || (c2 == -1)) {
           if ((_destLen - destCnt) > 1) {
-            _dest[destCnt++] = _src[cnt - 1];
-            _dest[destCnt++] = _src[cnt];
+            _dest[destCnt] = _src[cnt - 1]; destCnt++;
+            _dest[destCnt] = _src[cnt];     destCnt++;
           }
           else
             break;
         }
         else {
-          char c = ((c1 << 4) | c2);
-          _dest[destCnt++] = c;
+          register unsigned char c = ((c1 << 4) | c2);
+          _dest[destCnt] = c;
+         destCnt++;
         }
       }
       else 
index 4d437fa996d341f7e60e4fdb3426931cb01b7610..91ad9c031e80f662f0879e5233e0880ea2c053d4 100644 (file)
@@ -1,6 +1,6 @@
 # version
 
-SUBMINOR_VERSION:=179
+SUBMINOR_VERSION:=180
 
 # v4.3.115 requires libFoundation v1.0.59
 # v4.2.72  requires libEOControl  v4.2.39