| 86 | } |
| 87 | |
| 88 | ssize_t base64_encode_using_maps(const base64_maps_t *maps, |
| 89 | char *dest, const size_t destlen, |
| 90 | const char *src, const size_t srclen) |
| 91 | { |
| 92 | size_t src_offset = 0; |
| 93 | size_t dest_offset = 0; |
| 94 | |
| 95 | if (destlen < base64_encoded_length(srclen)) { |
| 96 | errno = EOVERFLOW; |
| 97 | return -1; |
| 98 | } |
| 99 | |
| 100 | while (srclen - src_offset >= 3) { |
| 101 | base64_encode_triplet_using_maps(maps, &dest[dest_offset], &src[src_offset]); |
| 102 | src_offset += 3; |
| 103 | dest_offset += 4; |
| 104 | } |
| 105 | |
| 106 | if (src_offset < srclen) { |
| 107 | base64_encode_tail_using_maps(maps, &dest[dest_offset], &src[src_offset], srclen-src_offset); |
| 108 | dest_offset += 4; |
| 109 | } |
| 110 | |
| 111 | memset(&dest[dest_offset], '\0', destlen-dest_offset); |
| 112 | |
| 113 | return dest_offset; |
| 114 | } |
| 115 | |
| 116 | size_t base64_decoded_length(size_t srclen) |
| 117 | { |
no test coverage detected