From 97baac1c3e72d18dfd5b790ad44e814b034bca5c Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Thu, 23 May 2013 21:30:49 +0100
Subject: [PATCH] [Add] Comments to base64.

---
 src/base64.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/base64.c b/src/base64.c
index 726bce1..6d0167a 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -2,9 +2,9 @@
 #include <string.h>
 #include <stdint.h>
 
-// Encode table.
+// Encode table - base64 alphabet is defined by the rfc
 static const char cb64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-// Decode table.
+// Generate decode table at compile time.
 #define B64(_)            \
   ((_) == 'A' ? 0         \
    : (_) == 'B' ? 1       \
@@ -72,6 +72,7 @@ static const char cb64[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx
    : (_) == '/' ? 63      \
    : -1)
 
+// Makes it much faster.
 static const signed char cd64[256] = {
   B64(0),   B64(1),   B64(2),   B64(3),
   B64(4),   B64(5),   B64(6),   B64(7),
@@ -180,6 +181,7 @@ char* base64_encode(size_t* len, char* src, size_t sz) {
   
   for(c = 0; c < pad; c++)
     r[i-c-1] = '=';
+  // It'll be a valid string.
   r[i] = '\0';
   (*len) = i;
 
@@ -212,19 +214,23 @@ char* base64_decode(size_t* len, char* src, size_t sz) {
   j = 0;
   for(i = 0; i < sz; i++) {
     if(src[i] == '=')
+      // Control padding.
       pad++;
     if(dec_valid(src[i]))
+      // Only allow valid characters.
       dat[j++] = src[i];
   }
 
   // Fill r.
   i = 0;
   for(c = 0; c < j; c += 4) {
-    n = dec_ch(dat[c+0]) << 18;
-    n += (c+1<j) ? (dec_ch(dat[c+1]) << 12) : 0;
+    // Process the input from base 64.
+    n = dec_ch(dat[c+0]) << 18; // Guaranteed to be valid.
+    n += (c+1<j) ? (dec_ch(dat[c+1]) << 12) : 0; // Check if in bounds.
     n += (c+2<j) ? (dec_ch(dat[c+2]) << 6) : 0;
     n += (c+3<j) ? (dec_ch(dat[c+3]) << 0) : 0;
 
+    // Convert the 24 bits of encoded data into 3 8 bit chunks.
     r[i++] = (n >> 16)  & 255;
     r[i++] = (n >> 8)   & 255;
     r[i++] = (n >> 0)   & 255;
@@ -234,7 +240,7 @@ char* base64_decode(size_t* len, char* src, size_t sz) {
   // Cleanup.
   free(dat);
 
-  (*len) = i - pad;
+  (*len) = i - pad; // Must decount the padding.
   return r;
 }