diff options
| author | 2016-10-22 04:39:47 +0200 | |
|---|---|---|
| committer | 2016-10-22 04:39:47 +0200 | |
| commit | 392135c7db4d9cb4a14ff5935d7c4c6e21363847 (patch) | |
| tree | 0e19125ed99b6b2ced754d1b9b3f4bc5245f8c39 /src/base64.c | |
| parent | a3263ad344ff315ac1cba96f0b84b9afff6da787 (diff) | |
| download | libplist-392135c7db4d9cb4a14ff5935d7c4c6e21363847.tar.gz libplist-392135c7db4d9cb4a14ff5935d7c4c6e21363847.tar.bz2 | |
Remove libxml2 dependency in favor of custom XML parsing
Diffstat (limited to 'src/base64.c')
| -rw-r--r-- | src/base64.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/base64.c b/src/base64.c index 7128a5a..e59d963 100644 --- a/src/base64.c +++ b/src/base64.c | |||
| @@ -43,32 +43,32 @@ static const signed char base64_table[256] = { | |||
| 43 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 | 43 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | char *base64encode(const unsigned char *buf, size_t *size) | 46 | size_t base64encode(char *outbuf, const unsigned char *buf, size_t size) |
| 47 | { | 47 | { |
| 48 | if (!buf || !size || !(*size > 0)) return NULL; | 48 | if (!outbuf || !buf || (size <= 0)) { |
| 49 | int outlen = (*size / 3) * 4; | 49 | return 0; |
| 50 | char *outbuf = (char*)malloc(outlen+5); // 4 spare bytes + 1 for '\0' | 50 | } |
| 51 | |||
| 51 | size_t n = 0; | 52 | size_t n = 0; |
| 52 | size_t m = 0; | 53 | size_t m = 0; |
| 53 | unsigned char input[3]; | 54 | unsigned char input[3]; |
| 54 | unsigned int output[4]; | 55 | unsigned int output[4]; |
| 55 | while (n < *size) { | 56 | while (n < size) { |
| 56 | input[0] = buf[n]; | 57 | input[0] = buf[n]; |
| 57 | input[1] = (n+1 < *size) ? buf[n+1] : 0; | 58 | input[1] = (n+1 < size) ? buf[n+1] : 0; |
| 58 | input[2] = (n+2 < *size) ? buf[n+2] : 0; | 59 | input[2] = (n+2 < size) ? buf[n+2] : 0; |
| 59 | output[0] = input[0] >> 2; | 60 | output[0] = input[0] >> 2; |
| 60 | output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); | 61 | output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); |
| 61 | output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); | 62 | output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); |
| 62 | output[3] = input[2] & 63; | 63 | output[3] = input[2] & 63; |
| 63 | outbuf[m++] = base64_str[(int)output[0]]; | 64 | outbuf[m++] = base64_str[(int)output[0]]; |
| 64 | outbuf[m++] = base64_str[(int)output[1]]; | 65 | outbuf[m++] = base64_str[(int)output[1]]; |
| 65 | outbuf[m++] = (n+1 < *size) ? base64_str[(int)output[2]] : base64_pad; | 66 | outbuf[m++] = (n+1 < size) ? base64_str[(int)output[2]] : base64_pad; |
| 66 | outbuf[m++] = (n+2 < *size) ? base64_str[(int)output[3]] : base64_pad; | 67 | outbuf[m++] = (n+2 < size) ? base64_str[(int)output[3]] : base64_pad; |
| 67 | n+=3; | 68 | n+=3; |
| 68 | } | 69 | } |
| 69 | outbuf[m] = 0; // 0-termination! | 70 | outbuf[m] = 0; // 0-termination! |
| 70 | *size = m; | 71 | return m; |
| 71 | return outbuf; | ||
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | static int base64decode_block(unsigned char *target, const char *data, size_t data_size) | 74 | static int base64decode_block(unsigned char *target, const char *data, size_t data_size) |
