X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fbase64.c;h=f1e0604503b1fa3951ba6a712665c49840b5a6f5;hb=fb84631f1ec8e82d252cbad0b5b7f83a98e74ba9;hp=97b6019b9d3bb5efbd2646fa0f670e59ef638a61;hpb=112ca20edbdbbede4ffeac64892bb4fc5e1b04d6;p=gnulib.git diff --git a/lib/base64.c b/lib/base64.c index 97b6019b9..f1e060450 100644 --- a/lib/base64.c +++ b/lib/base64.c @@ -1,5 +1,5 @@ /* base64.c -- Encode binary data using printable characters. - Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* Written by Simon Josefsson. Partially adapted from GNU MailUtils * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review @@ -36,7 +36,7 @@ * FAIL: input too long * if (out == NULL) * FAIL: memory allocation error - * OK: data in OUT/LEN. + * OK: data in OUT/OUTLEN. * */ @@ -65,30 +65,34 @@ void base64_encode (const char *restrict in, size_t inlen, char *restrict out, size_t outlen) { - const char b64[64] = + static const char b64str[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while (inlen && outlen) { - *out++ = b64[to_uchar (in[0]) >> 2]; + *out++ = b64str[to_uchar (in[0]) >> 2]; if (!--outlen) break; - *out++ = b64[((to_uchar (in[0]) << 4) - + (--inlen ? to_uchar (in[1]) >> 4 : 0)) & 0x3f]; + *out++ = b64str[((to_uchar (in[0]) << 4) + + (--inlen ? to_uchar (in[1]) >> 4 : 0)) + & 0x3f]; if (!--outlen) break; *out++ = (inlen - ? b64[((to_uchar (in[1]) << 2) - + (--inlen ? to_uchar (in[2]) >> 6 : 0)) & 0x3f] : '='); + ? b64str[((to_uchar (in[1]) << 2) + + (--inlen ? to_uchar (in[2]) >> 6 : 0)) + & 0x3f] + : '='); if (!--outlen) break; - *out++ = inlen ? b64[to_uchar (in[2]) & 0x3f] : '='; + *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; if (!--outlen) break; if (inlen) inlen--; - in += 3; + if (inlen) + in += 3; } if (outlen) @@ -274,10 +278,10 @@ static const signed char b64[0x100] = { B64 (252), B64 (253), B64 (254), B64 (255) }; -static inline bool -isb64 (unsigned char ch) +bool +isbase64 (char ch) { - return ch <= 255 && 0 <= b64[ch]; + return to_uchar (ch) <= 255 && 0 <= b64[to_uchar (ch)]; } /* Decode base64 encoded input array IN of length INLEN to output @@ -289,13 +293,13 @@ isb64 (unsigned char ch) encountered, decoding is stopped and false is returned. */ bool base64_decode (const char *restrict in, size_t inlen, - char *restrict out, size_t * outlen) + char *restrict out, size_t *outlen) { size_t outleft = *outlen; while (inlen >= 2) { - if (!isb64 (in[0]) || !isb64 (in[1])) + if (!isbase64 (in[0]) || !isbase64 (in[1])) break; if (outleft) @@ -319,7 +323,7 @@ base64_decode (const char *restrict in, size_t inlen, } else { - if (!isb64 (in[2])) + if (!isbase64 (in[2])) break; if (outleft) @@ -339,7 +343,7 @@ base64_decode (const char *restrict in, size_t inlen, } else { - if (!isb64 (in[3])) + if (!isbase64 (in[3])) break; if (outleft) @@ -376,7 +380,7 @@ base64_decode (const char *restrict in, size_t inlen, undefined. */ bool base64_decode_alloc (const char *in, size_t inlen, char **out, - size_t * outlen) + size_t *outlen) { /* This may allocate a few bytes too much, depending on input, but it's not worth the extra CPU time to compute the exact amount.