Main Page | Namespace List | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

libstrfunc.c

Go to the documentation of this file.
00001 
00002 /* Taken from LibStrfunc v7.3 */
00003 
00004 #include <stdio.h>
00005 #include <ctype.h>
00006 #include <stdlib.h>
00007 #include "libstrfunc.h"
00008 
00009 
00010 static char base64_code_chars[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/==";
00011 
00012 void base64_append(char **ou, int *line_count, char data)
00013 {
00014     if (*line_count == 76) {
00015         *(*ou)++ = '\n';
00016         *line_count = 0;
00017     }
00018     *(*ou)++ = data;
00019     (*line_count)++;
00020 }
00021 
00022 
00023 char *base64_encode(void *data, size_t size)
00024 {
00025     int line_count = 0;
00026     return base64_encode_multiple(data, size, &line_count);
00027 }
00028 
00029 
00030 char *base64_encode_multiple(void *data, size_t size, int *line_count)
00031 {
00032     char *output;
00033     char *ou;
00034     unsigned char *p   = (unsigned char *)data;
00035     unsigned char *dte = p + size;
00036 
00037     if (data == NULL || size == 0) return NULL;
00038 
00039     ou = output = (char *)malloc(size / 3 * 4 + (size / 57) + 6);
00040     if (!output) return NULL;
00041 
00042     while((dte-p) >= 3) {
00043         unsigned char x = p[0];
00044         unsigned char y = p[1];
00045         unsigned char z = p[2];
00046         base64_append(&ou, line_count, base64_code_chars[ x >> 2 ]);
00047         base64_append(&ou, line_count, base64_code_chars[ ((x & 0x03) << 4) | (y >> 4) ]);
00048         base64_append(&ou, line_count, base64_code_chars[ ((y & 0x0F) << 2) | (z >> 6) ]);
00049         base64_append(&ou, line_count, base64_code_chars[ z & 0x3F ]);
00050         p+=3;
00051     };
00052     if ((dte-p) == 2) {
00053         base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00054         base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) | (p[1] >> 4) ]);
00055         base64_append(&ou, line_count, base64_code_chars[ ((p[1] & 0x0F) << 2) ]);
00056         base64_append(&ou, line_count, '=');
00057     } else if ((dte-p) == 1) {
00058         base64_append(&ou, line_count, base64_code_chars[ *p >> 2 ]);
00059         base64_append(&ou, line_count, base64_code_chars[ ((*p & 0x03) << 4) ]);
00060         base64_append(&ou, line_count, '=');
00061         base64_append(&ou, line_count, '=');
00062     };
00063 
00064     *ou=0;
00065     return output;
00066 };
00067 
00068 
00069 void hexdump(char *hbuf, int start, int stop, int ascii) /* {{{ HexDump all or a part of some buffer */
00070 {
00071     char c;
00072     int diff,i;
00073 
00074     while (start < stop ) {
00075         diff = stop - start;
00076         if (diff > 16) diff = 16;
00077 
00078         fprintf(stderr, ":%08X  ",start);
00079 
00080         for (i = 0; i < diff; i++) {
00081             if( 8 == i ) fprintf( stderr, " " );
00082             fprintf(stderr, "%02X ",(unsigned char)*(hbuf+start+i));
00083         }
00084         if (ascii) {
00085             for (i = diff; i < 16; i++) fprintf(stderr, "   ");
00086             for (i = 0; i < diff; i++) {
00087                 c = *(hbuf+start+i);
00088                 fprintf(stderr, "%c", isprint(c) ? c : '.');
00089             }
00090         }
00091         fprintf(stderr, "\n");
00092         start += 16;
00093     }
00094 }

Generated on Thu Dec 11 11:58:49 2008 for 'LibPst' by  doxygen 1.3.9.1