services/geocaching/src/base64.c
/**
 * base64_encode - Base64 encode
 * @src: Data to be encoded
 * @len: Length of the data to be encoded
 * @out_len: Pointer to output length variable, or %NULL if not used
 * Returns: Allocated buffer of out_len bytes of encoded data,
 * or %NULL on failure
 *
 * Caller is responsible for freeing the returned buffer. Returned buffer is
 * nul terminated to make it easier to use as a C string. The nul terminator is
 * not included in out_len.
 */
Base64 encode
@src: Data to be encoded
@len: Length of the data to be encoded
@out_len: Pointer to output length variable, or %NULL if not used
Returns: Allocated buffer of out_len bytes of encoded data,
or %NULL on failure

Caller is responsible for freeing the returned buffer. Returned buffer is
nul terminated to make it easier to use as a C string. The nul terminator is
not included in out_len.
Base64 encode @src : Data to be encoded @len : Length of the data to be encoded @out_len : Pointer to output length variable or %NULL if not used Returns : Allocated buffer of out_len bytes of encoded data or %NULL on failure Caller is responsible for freeing the returned buffer . Returned buffer is nul terminated to make it easier to use as a C string . The nul terminator is not included in out_len .
unsigned char * base64_encode(const unsigned char *src, size_t len,
                              size_t *out_len)
{
    unsigned char *out, *pos;
    const unsigned char *end, *in;
    size_t olen;
    int line_len;
    olen = len * 4 / 3 + 4; 
    olen++; 
    if (olen < len)
        return NULL; 
    out = malloc(olen);
    if (out == NULL)
        return NULL;
    end = src + len;
    in = src;
    pos = out;
    line_len = 0;
    while (end - in >= 3) {
        *pos++ = base64_table[in[0] >> 2];
        *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
        *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
        *pos++ = base64_table[in[2] & 0x3f];
        in += 3;
        line_len += 4;
    }
    if (end - in) {
        *pos++ = base64_table[in[0] >> 2];
        if (end - in == 1) {
            *pos++ = base64_table[(in[0] & 0x03) << 4];
            *pos++ = '=';
        } else {
            *pos++ = base64_table[((in[0] & 0x03) << 4) |
                                  (in[1] >> 4)];
            *pos++ = base64_table[(in[1] & 0x0f) << 2];
        }
        *pos++ = '=';
        line_len += 4;
    }
    *pos = '\0';
    if (out_len)
        *out_len = pos - out;
    return out;
}
unsigned char * base64_encode ( const unsigned char * src , size_t len , size_t * out_len ) { unsigned char * out , * pos ; const unsigned char * end , * in ; size_t olen ; int line_len ; olen = len * 4 / 3 + 4 ; olen ++ ; if ( olen < len ) return NULL ; out = malloc ( olen ) ; if ( out == NULL ) return NULL ; end = src + len ; in = src ; pos = out ; line_len = 0 ; while ( end - in >= 3 ) { * pos ++ = base64_table [ in [ 0 ] >> 2 ] ; * pos ++ = base64_table [ ( ( in [ 0 ] & 0x03 ) << 4 ) | ( in [ 1 ] >> 4 ) ] ; * pos ++ = base64_table [ ( ( in [ 1 ] & 0x0f ) << 2 ) | ( in [ 2 ] >> 6 ) ] ; * pos ++ = base64_table [ in [ 2 ] & 0x3f ] ; in += 3 ; line_len += 4 ; } if ( end - in ) { * pos ++ = base64_table [ in [ 0 ] >> 2 ] ; if ( end - in == 1 ) { * pos ++ = base64_table [ ( in [ 0 ] & 0x03 ) << 4 ] ; * pos ++ = ' ' ; } else { * pos ++ = base64_table [ ( ( in [ 0 ] & 0x03 ) << 4 ) | ( in [ 1 ] >> 4 ) ] ; * pos ++ = base64_table [ ( in [ 1 ] & 0x0f ) << 2 ] ; } * pos ++ = ' ' ; line_len += 4 ; } * pos = ' \0 ' ; if ( out_len ) * out_len = pos - out ; return out ; }
base64_encode - Base64 encode
 @src: Data to be encoded
 @len: Length of the data to be encoded
 @out_len: Pointer to output length variable, or %NULL if not used
 Returns: Allocated buffer of out_len bytes of encoded data,
 or %NULL on failure
base64_encode - Base64 encode @src : Data to be encoded @len : Length of the data to be encoded @out_len : Pointer to output length variable or %NULL if not used Returns : Allocated buffer of out_len bytes of encoded data or %NULL on failure
/* 3-byte blocks to 4-byte */ /* nul termination */ /* integer overflow */