]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Reduced conditional logic in base64_encode
authorcompmaniak <6314398+compmaniak@users.noreply.github.com>
Wed, 30 Aug 2017 22:25:22 +0000 (01:25 +0300)
committerJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Thu, 31 Aug 2017 07:44:32 +0000 (10:44 +0300)
src/lib/base64.c

index a645dd2fbe1aea550bcf9e76db2b3480e9d6b453..d84014b7b223da3570c4cb9c7b284677c7fea7a2 100644 (file)
@@ -49,32 +49,35 @@ void base64_encode(const void *src, size_t src_size, buffer_t *dest)
        unsigned char tmp[4];
        size_t src_pos;
 
-       for (src_pos = 0; src_pos < src_size; ) {
+       for (src_pos = 0; src_size - src_pos > 2; src_pos += 3) {
                tmp[0] = b64enc[src_c[src_pos] >> 2];
-               switch (src_size - src_pos) {
-               case 1:
-                       tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4];
-                       tmp[2] = '=';
-                       tmp[3] = '=';
-                       src_pos++;
-                       break;
-               case 2:
-                       tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
-                                       (src_c[src_pos+1] >> 4)];
-                       tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)];
-                       tmp[3] = '=';
-                       src_pos += 2;
-                       break;
-               default:
-                       tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
-                                       (src_c[src_pos+1] >> 4)];
-                       tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) |
-                                       ((src_c[src_pos+2] & 0xc0) >> 6)];
-                       tmp[3] = b64enc[src_c[src_pos+2] & 0x3f];
-                       src_pos += 3;
-                       break;
-               }
+               tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
+                               (src_c[src_pos+1] >> 4)];
+               tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2) |
+                               ((src_c[src_pos+2] & 0xc0) >> 6)];
+               tmp[3] = b64enc[src_c[src_pos+2] & 0x3f];
+               buffer_append(dest, tmp, 4);
+       }
+       switch (src_size - src_pos) {
+       case 0:
+               break;
+       case 1:
+               tmp[0] = b64enc[src_c[src_pos] >> 2];
+               tmp[1] = b64enc[(src_c[src_pos] & 0x03) << 4];
+               tmp[2] = '=';
+               tmp[3] = '=';
+               buffer_append(dest, tmp, 4);
+               break;
+       case 2:
+               tmp[0] = b64enc[src_c[src_pos] >> 2];
+               tmp[1] = b64enc[((src_c[src_pos] & 0x03) << 4) |
+                               (src_c[src_pos+1] >> 4)];
+               tmp[2] = b64enc[((src_c[src_pos+1] & 0x0f) << 2)];
+               tmp[3] = '=';
                buffer_append(dest, tmp, 4);
+               break;
+       default:
+               i_unreached();
        }
 }