--- old/uuencode.c
+++ new/uuencode.c
@@ -112,28 +112,33 @@
 `------------------------------------------------*/
 
 static size_t
-encode_block (char * out, unsigned char const * in, size_t in_len)
+encode_block (char * out, unsigned char * in, int in_len)
 {
   char * start = out;
+  unsigned char * in_end = in + in_len;
+  unsigned int triplet;
 
-  while (in_len >= 3)
+  switch (in_len % 3)
     {
-      *(out++) = ENC (in[0] >> 2);
-      *(out++) = ENC (((in[0] & 0x03) << 4) + ((in[1] >> 4) & 0x0F));
-      *(out++) = ENC (((in[1] & 0x0F) << 2) + ((in[2] >> 6) & 0x03));
-      *(out++) = ENC (in[2] & 0x3F);
-      in_len -= 3;
-      in += 3;
+    case 1:
+      *(in_end++) = '\0';
+    case 2:
+      *(in_end++) = '\0';
     }
 
-  if (in_len > 0)
+  do
     {
-      unsigned char lc = (in_len > 1) ? in[1] : '\0';
-      *(out++) = ENC (in[0] >> 2);
-      *(out++) = ENC (((in[0] & 0x03) << 4) + ((lc >> 4) & 0x0F));
-      *(out++) = ENC ((lc & 0x0F) << 2);
-      *(out++) = ENC (0);
-    }
+      triplet = *(in++);
+      triplet <<= 8;
+      triplet = *(in++);
+      triplet <<= 8;
+      triplet = *(in++);
+
+      *(out++) = ENC (triplet >> 18);
+      *(out++) = ENC (triplet >> 12);
+      *(out++) = ENC (triplet >> 6);
+      *(out++) = ENC (triplet);
+    } while (in < in_end);
 
   return out - start;
 }
