]> git.sesse.net Git - vlc/commitdiff
Fix base64 encoding and add regression test
authorRémi Denis-Courmont <rem@videolan.org>
Wed, 30 Aug 2006 14:58:18 +0000 (14:58 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Wed, 30 Aug 2006 14:58:18 +0000 (14:58 +0000)
include/vlc_url.h
src/test/url.c

index ab30180b74fa210a15362c97d0e5f621e5e92ce8..85a8a84c0a46ba51444693c83b9c2b242992bdde 100644 (file)
@@ -217,7 +217,7 @@ static inline int vlc_UrlIsNotEncoded( const char *psz_url )
  *****************************************************************************
  *
  *****************************************************************************/
-static inline char *vlc_b64_encode( char *src )
+static inline char *vlc_b64_encode( const char *src )
 {
     static const char b64[] =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -232,38 +232,29 @@ static inline char *vlc_b64_encode( char *src )
 
     while( len > 0 )
     {
-        /* pops (up to) 3 bytes of input */
-        uint32_t v = *src++ << 24;
+        /* pops (up to) 3 bytes of input, push 4 bytes */
+        uint32_t v = *src++ << 24; // 1/3
+        *dst++ = b64[v >> 26]; // 1/4
+        v = v << 6;
 
         if( len >= 2 )
-        {
-            v |= *src++ << 16;
-            if( len >= 3 )
-                v |= *src++ << 8;
-        }
+            v |= *src++ << 16; // 2/3
+        *dst++ = b64[v >> 26]; // 2/4
+        v = v << 6;
 
-        /* pushes (up to) 4 bytes of output */
-        while( v )
-        {
-            *dst++ = b64[v >> 26];
-            v = v << 6;
-        }
+        if( len >= 3 )
+            v |= *src++ << 8; // 3/3
+        *dst++ = ( len >= 2 ) ? b64[v >> 26] : '='; // 3/4
+        v = v << 6;
 
-        switch( len )
+        *dst++ = ( len >= 3 ) ? b64[v >> 26] : '='; // 4/4
+
+        len--;
+        if( len > 0 )
         {
-            case 1:
-                *dst++ = '=';
-                *dst++ = '=';
+            len--;
+            if( len > 0 )
                 len--;
-                break;
-
-            case 2:
-                *dst++ = '=';
-                len -= 2;
-                break;
-
-            default:
-                len -= 3;
         }
     }
 
index fa5299d4ac3e4c4dea1a5ee23851e9d7252e9686..b1accf1a9cd38551834f31db607ff4d775f92308 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 
-void test_decode (const char *in, const char *out)
+typedef char * (*conv_t) (const char *);
+
+static void test (conv_t f, const char *in, const char *out)
 {
     char *res;
 
     printf ("\"%s\" -> \"%s\" ?\n", in, out);
-    res = decode_URI_duplicate (in);
+    res = f (in);
     if (res == NULL)
         exit (1);
 
     if (strcmp (res, out))
+    {
+        printf (" ERROR: got \"%s\"\n", res);
         exit (2);
+    }
 
     free (res);
 }
 
+static inline void test_decode (const char *in, const char *out)
+{
+    test (decode_URI_duplicate, in, out);
+}
+
+static inline void test_b64 (const char *in, const char *out)
+{
+    test (vlc_b64_encode, in, out);
+}
+
 int main (void)
 {
     (void)setvbuf (stdout, NULL, _IONBF, 0);
@@ -64,5 +79,12 @@ int main (void)
     test_decode ("T%E9l%E9vision", "T?l?vision");
     test_decode ("%C1%94%C3%a9l%c3%A9vision", "??élévision"); /* overlong */
 
+    /* Base 64 tests */
+    test_b64 ("", "");
+    test_b64 ("d", "ZA==");
+    test_b64 ("ab", "YQG=");
+    test_b64 ("abc", "YQGI");
+    test_b64 ("abcd", "YQGIZA==");
+
     return 0;
 }