X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fbase64.c;h=4dbd80a1c0c1797dc0faae125d9fa0b6e5111302;hb=fdba88ca5c48680a219e742f0b3d480daf74703d;hp=48f3dc7a4167b713d3666978ae00e4e2c613753c;hpb=1eccb9ebfa5fcc76c78976bc504e9bfd2e78f77c;p=gnulib.git diff --git a/lib/base64.c b/lib/base64.c index 48f3dc7a4..4dbd80a1c 100644 --- a/lib/base64.c +++ b/lib/base64.c @@ -1,5 +1,6 @@ /* base64.c -- Encode binary data using printable characters. - Copyright (C) 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006 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 @@ -36,7 +37,7 @@ * FAIL: input too long * if (out == NULL) * FAIL: memory allocation error - * OK: data in OUT/LEN. + * OK: data in OUT/OUTLEN. * */ @@ -50,6 +51,9 @@ /* Get malloc. */ #include +/* Get UCHAR_MAX. */ +#include + /* C89 compliant way to cast 'char' to 'unsigned char'. */ static inline unsigned char to_uchar (char ch) @@ -65,12 +69,12 @@ void base64_encode (const char *restrict in, size_t inlen, char *restrict out, size_t outlen) { - const char b64str[64] = + static const char b64str[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while (inlen && outlen) { - *out++ = b64str[to_uchar (in[0]) >> 2]; + *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; if (!--outlen) break; *out++ = b64str[((to_uchar (in[0]) << 4) @@ -105,8 +109,8 @@ base64_encode (const char *restrict in, size_t inlen, return, the OUT variable will hold a pointer to newly allocated memory that must be deallocated by the caller. If output string length would overflow, 0 is returned and OUT is set to NULL. If - memory allocation fail, OUT is set to NULL, and the return value - indicate length of the requested memory block, i.e., + memory allocation failed, OUT is set to NULL, and the return value + indicates length of the requested memory block, i.e., BASE64_LENGTH(inlen) + 1. */ size_t base64_encode_alloc (const char *in, size_t inlen, char **out) @@ -132,8 +136,10 @@ base64_encode_alloc (const char *in, size_t inlen, char **out) } *out = malloc (outlen); - if (*out) - base64_encode (in, inlen, *out, outlen); + if (!*out) + return outlen; + + base64_encode (in, inlen, *out, outlen); return outlen - 1; } @@ -278,10 +284,19 @@ static const signed char b64[0x100] = { B64 (252), B64 (253), B64 (254), B64 (255) }; +#if UCHAR_MAX == 255 +# define uchar_in_range(c) true +#else +# define uchar_in_range(c) ((c) <= 255) +#endif + +/* Return true if CH is a character from the Base64 alphabet, and + false otherwise. Note that '=' is padding and not considered to be + part of the alphabet. */ bool isbase64 (char ch) { - return to_uchar (ch) <= 255 && 0 <= b64[to_uchar (ch)]; + return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; } /* Decode base64 encoded input array IN of length INLEN to output @@ -290,7 +305,9 @@ isbase64 (char ch) otherwise. If *OUTLEN is too small, as many bytes as possible will be written to OUT. On return, *OUTLEN holds the length of decoded bytes in OUT. Note that as soon as any non-alphabet characters are - encountered, decoding is stopped and false is returned. */ + encountered, decoding is stopped and false is returned. This means + that, when applicable, you must remove any line terminators that is + part of the data stream before calling this function. */ bool base64_decode (const char *restrict in, size_t inlen, char *restrict out, size_t *outlen) @@ -372,11 +389,11 @@ base64_decode (const char *restrict in, size_t inlen, size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL, if the caller is not interested in the decoded length. *OUT may be NULL to indicate an out of memory error, in which case *OUTLEN - contain the size of the memory block needed. The function return + contains the size of the memory block needed. The function returns true on successful decoding and memory allocation errors. (Use the *OUT and *OUTLEN parameters to differentiate between successful - decoding and memory error.) The function return false if the input - was invalid, in which case *OUT is NULL and *OUTLEN is + decoding and memory error.) The function returns false if the + input was invalid, in which case *OUT is NULL and *OUTLEN is undefined. */ bool base64_decode_alloc (const char *in, size_t inlen, char **out,