blob: bbb92d6002ead60317ecd0922d76b3648b307840 [file] [log] [blame]
Denis Vlasenko21afc7d2006-09-03 15:49:40 +00001/* vi: set sw=4 ts=4: */
2/*
3 * Copyright 2006 Rob Landley <rob@landley.net>
4 *
5 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
6 */
7
8#include "libbb.h"
9
10/* Conversion table. for base 64 */
Denis Vlasenkoaa198dd2007-06-12 07:24:11 +000011const char bb_uuenc_tbl_base64[65 + 2] = {
Denis Vlasenko21afc7d2006-09-03 15:49:40 +000012 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
13 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
14 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
15 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
16 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
17 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
18 'w', 'x', 'y', 'z', '0', '1', '2', '3',
19 '4', '5', '6', '7', '8', '9', '+', '/',
Denis Vlasenkoaa198dd2007-06-12 07:24:11 +000020 '=' /* termination character */,
21 '\n', '\0' /* needed for uudecode.c */
Denis Vlasenko21afc7d2006-09-03 15:49:40 +000022};
23
24const char bb_uuenc_tbl_std[65] = {
25 '`', '!', '"', '#', '$', '%', '&', '\'',
26 '(', ')', '*', '+', ',', '-', '.', '/',
27 '0', '1', '2', '3', '4', '5', '6', '7',
28 '8', '9', ':', ';', '<', '=', '>', '?',
29 '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
30 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
31 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
32 'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
33 '`' /* termination character */
34};
35
36/*
37 * Encode the string S of length LENGTH to base64 format and place it
38 * to STORE. STORE will be 0-terminated, and must point to a writable
39 * buffer of at least 1+BASE64_LENGTH(length) bytes.
40 * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3))
41 */
42void bb_uuencode(const unsigned char *s, char *store, const int length, const char *tbl)
43{
44 int i;
45 char *p = store;
46
47 /* Transform the 3x8 bits to 4x6 bits, as required by base64. */
48 for (i = 0; i < length; i += 3) {
49 *p++ = tbl[s[0] >> 2];
50 *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
51 *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
52 *p++ = tbl[s[2] & 0x3f];
53 s += 3;
54 }
55 /* Pad the result if necessary... */
56 if (i == length + 1) {
57 *(p - 1) = tbl[64];
58 }
59 else if (i == length + 2) {
60 *(p - 1) = *(p - 2) = tbl[64];
61 }
62 /* ...and zero-terminate it. */
63 *p = '\0';
64}