2 * Generic base 64 input and output routines
4 * Written by Kern E. Sibbald, March MM.
9 Copyright (C) 2000-2005 Kern Sibbald
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License
13 version 2 as amended with additional clauses defined in the
14 file LICENSE in the main source directory.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 the file LICENSE for additional details.
31 static uint8_t const base64_digits[64] =
33 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
34 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
35 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
36 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
37 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
40 static int base64_inited = 0;
41 static uint8_t base64_map[128];
44 /* Initialize the Base 64 conversion routines */
49 memset(base64_map, 0, sizeof(base64_map));
51 base64_map[(uint8_t)base64_digits[i]] = i;
55 /* Convert a value to base64 characters.
56 * The result is stored in where, which
57 * must be at least 8 characters long.
59 * Returns the number of characters
60 * stored (not including the EOS).
63 to_base64(intmax_t value, char *where)
69 /* Handle negative values */
75 /* Determine output size */
83 /* Output characters */
87 where[--i] = base64_digits[val & (uintmax_t)0x3F];
94 * Convert the Base 64 characters in where to
95 * a value. No checking is done on the validity
101 from_base64(intmax_t *value, char *where)
108 /* Check if it is negative */
110 if (where[i] == '-') {
114 /* Construct value */
115 while (where[i] != 0 && where[i] != ' ') {
117 val += base64_map[(uint8_t)where[i++]];
120 *value = neg ? -(intmax_t)val : (intmax_t)val;
126 * Encode binary data in bin of len bytes into
127 * buf as base64 characters.
129 * Returns: the number of characters stored not
133 bin_to_base64(char *buf, char *bin, int len)
135 uint32_t reg, save, mask;
144 reg |= (int8_t)bin[i++];
149 buf[j++] = base64_digits[reg & (uint32_t)0x3F];
155 for (i=1; i<rem; i++) {
156 mask = (mask << 1) | 1;
158 buf[j++] = base64_digits[reg & mask];
165 int main(int argc, char *argv[])
174 for (i=0; i < 1000; i++) {
175 bin_to_base64(buf, (char *)&xx, 4);
176 printf("xx=%s\n", buf);
181 for (i=1; i<100; i++) {
182 junk[i] = junk[i-1]-1;
184 len = bin_to_base64(buf, junk, 16);
185 printf("len=%d junk=%s\n", len, buf);
191 static int errfunc(const char *epath, int eernoo)
193 printf("in errfunc\n");
199 * Test the base64 routines by encoding and decoding
202 int main(int argc, char *argv[])
212 time_t t = 1028712799;
214 if (argc > 1 && strcmp(argv[1], "-v") == 0)
220 glob("/etc/grub.conf", GLOB_MARK, errfunc, &my_glob);
222 for (i=0; my_glob.gl_pathv[i]; i++) {
223 fname = my_glob.gl_pathv[i];
224 if (lstat(fname, &statp) < 0) {
225 printf("Cannot stat %s: %s\n", fname, strerror(errno));
228 encode_stat(where, &statp);
230 printf("Encoded stat=%s\n", where);
234 p += to_base64((intmax_t)(statp.st_atime), p);
236 p += to_base64((intmax_t)t, p);
237 printf("%s %s\n", fname, where);
239 printf("%s %lld\n", "st_dev", (intmax_t)statp.st_dev);
240 printf("%s %lld\n", "st_ino", (intmax_t)statp.st_ino);
241 printf("%s %lld\n", "st_mode", (intmax_t)statp.st_mode);
242 printf("%s %lld\n", "st_nlink", (intmax_t)statp.st_nlink);
243 printf("%s %lld\n", "st_uid", (intmax_t)statp.st_uid);
244 printf("%s %lld\n", "st_gid", (intmax_t)statp.st_gid);
245 printf("%s %lld\n", "st_rdev", (intmax_t)statp.st_rdev);
246 printf("%s %lld\n", "st_size", (intmax_t)statp.st_size);
247 printf("%s %lld\n", "st_blksize", (intmax_t)statp.st_blksize);
248 printf("%s %lld\n", "st_blocks", (intmax_t)statp.st_blocks);
249 printf("%s %lld\n", "st_atime", (intmax_t)statp.st_atime);
250 printf("%s %lld\n", "st_mtime", (intmax_t)statp.st_mtime);
251 printf("%s %lld\n", "st_ctime", (intmax_t)statp.st_ctime);
255 printf("%s: len=%d val=%s\n", fname, strlen(where), where);
257 decode_stat(where, &statn);
259 if (statp.st_dev != statn.st_dev ||
260 statp.st_ino != statn.st_ino ||
261 statp.st_mode != statn.st_mode ||
262 statp.st_nlink != statn.st_nlink ||
263 statp.st_uid != statn.st_uid ||
264 statp.st_gid != statn.st_gid ||
265 statp.st_rdev != statn.st_rdev ||
266 statp.st_size != statn.st_size ||
267 statp.st_blksize != statn.st_blksize ||
268 statp.st_blocks != statn.st_blocks ||
269 statp.st_atime != statn.st_atime ||
270 statp.st_mtime != statn.st_mtime ||
271 statp.st_ctime != statn.st_ctime) {
273 printf("%s: %s\n", fname, where);
274 encode_stat(where, &statn);
275 printf("%s: %s\n", fname, where);
276 printf("NOT EQAL\n");
282 printf("%d files examined\n", i);
284 to_base64(UINT32_MAX, where);
285 printf("UINT32_MAX=%s\n", where);