libstrfunc.c

Go to the documentation of this file.
00001 
00002 /* Taken from LibStrfunc v7.3 */
00003 
00004 #include "define.h"
00005 
00006 
00007 static char base64_code_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/==";
00008 
00009 static void base64_append(char **ou, int *line_count, char data);
00010 static void base64_append(char **ou, int *line_count, char data)
00011 {
00012     if (*line_count == 76) {
00013         *(*ou)++ = '\n';
00014         *line_count = 0;
00015     }
00016     *(*ou)++ = data;
00017     if (*line_count >= 0) (*line_count)++;
00018 }
00019 
00020 
00021 char *pst_base64_encode(void *data, size_t size)
00022 {
00023     int line_count = 0;
00024     return pst_base64_encode_multiple(data, size, &line_count);
00025 }
00026 
00027 
00028 char *pst_base64_encode_single(void *data, size_t size)
00029 {
00030     int line_count = -1;
00031     return pst_base64_encode_multiple(data, size, &line_count);
00032 }
00033 
00034 
00035 char *pst_base64_encode_multiple(void *data, size_t size, int *line_count)
00036 {
00037     char *output;
00038     char *ou;
00039     unsigned char *p   = (unsigned char *)data;
00040     unsigned char *dte = p + size;
00041 
00042     if (data == NULL || size == 0) return NULL;
00043 
00044     ou = output = (char *)malloc(size / 3 * 4 + (size / 57) + 6);
00045     if (!output) return NULL;
00046 
00047     while((dte-p) >= 3) {
00048         unsigned char x = p[0];
00049         unsigned char y = p[1];
00050         unsigned char z = p[2];
00051         base64_append(&ou, line_count, base64_code_chars[ x >> 2 ]);
00052         base64_append(&ou, line_count, base64_code_chars[ ((x & 0x03) << 4) | (y >> 4) ]);
00053         base64_append(&ou, line_count, base64_code_chars[ ((y & 0x0F) << 2) | (z >> 6) ]);
00054         base64_append(&ou, line_count, base64_code_chars[ z & 0x3F ]);
00055         p+=3;
00056     };
00057     if ((dte-p) == 2) {
00058         base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00059         base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) | (p[1] >> 4) ]);
00060         base64_append(&ou, line_count, base64_code_chars[ ((p[1] & 0x0F) << 2) ]);
00061         base64_append(&ou, line_count, '=');
00062     } else if ((dte-p) == 1) {
00063         base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00064         base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) ]);
00065         base64_append(&ou, line_count, '=');
00066         base64_append(&ou, line_count, '=');
00067     };
00068 
00069     *ou=0;
00070     return output;
00071 };
00072 
00073 

Generated on 6 Jul 2016 for 'LibPst' by  doxygen 1.6.1