- don't free user-supplied string (via -e)
[oweals/busybox.git] / libbb / uuencode.c
index 08fe3f36673b6a61557cf3a510461b981e745800..67d98d598add4c42b4ba3285bf7beeb3c98a95de 100644 (file)
@@ -8,7 +8,7 @@
 #include "libbb.h"
 
 /* Conversion table.  for base 64 */
-const char bb_uuenc_tbl_base64[65 + 2] = {
+const char bb_uuenc_tbl_base64[65 + 2] ALIGN1 = {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
@@ -21,7 +21,7 @@ const char bb_uuenc_tbl_base64[65 + 2] = {
        '\n', '\0' /* needed for uudecode.c */
 };
 
-const char bb_uuenc_tbl_std[65] = {
+const char bb_uuenc_tbl_std[65] ALIGN1 = {
        '`', '!', '"', '#', '$', '%', '&', '\'',
        '(', ')', '*', '+', ',', '-', '.', '/',
        '0', '1', '2', '3', '4', '5', '6', '7',
@@ -39,27 +39,33 @@ const char bb_uuenc_tbl_std[65] = {
  * buffer of at least 1+BASE64_LENGTH(length) bytes.
  * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3))
  */
-void bb_uuencode(char *store, const void *src, int length, const char *tbl)
+void FAST_FUNC bb_uuencode(char *p, const void *src, int length, const char *tbl)
 {
-       int i;
        const unsigned char *s = src;
-       char *p = store;
 
-       /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
-       for (i = 0; i < length; i += 3) {
+       /* Transform the 3x8 bits to 4x6 bits */
+       while (length > 0) {
+               unsigned s1, s2;
+
+               /* Are s[1], s[2] valid or should be assumed 0? */
+               s1 = s2 = 0;
+               length -= 3; /* can be >=0, -1, -2 */
+               if (length >= -1) {
+                       s1 = s[1];
+                       if (length >= 0)
+                               s2 = s[2];
+               }
                *p++ = tbl[s[0] >> 2];
-               *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
-               *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
-               *p++ = tbl[s[2] & 0x3f];
+               *p++ = tbl[((s[0] & 3) << 4) + (s1 >> 4)];
+               *p++ = tbl[((s1 & 0xf) << 2) + (s2 >> 6)];
+               *p++ = tbl[s2 & 0x3f];
                s += 3;
        }
-       /* Pad the result if necessary...  */
-       if (i == length + 1) {
-               *(p - 1) = tbl[64];
-       }
-       else if (i == length + 2) {
-               *(p - 1) = *(p - 2) = tbl[64];
-       }
-       /* ...and zero-terminate it.  */
+       /* Zero-terminate */
        *p = '\0';
+       /* If length is -2 or -1, pad last char or two */
+       while (length) {
+               *--p = tbl[64];
+               length++;
+       }
 }