Check-in [6a35673b78]

Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
SHA1 Hash:6a35673b789beb67da9953c3293edb74bfd81e50
Date: 2008-11-14 10:53:47
User: stephan
Comment:added base64 encode/decode routines, so we can c11n binary data.
Changes
hide diffs unified diffs patch

Added include/s11n.net/c11n/detail/b64/cdecode.h

Old () New (aace08acbdf2158a)
> 1 /*
> 2 cdecode.h - c header for a base64 decoding algorithm
> 3
> 4 This is part of the libb64 project, and has been placed in the public domain.
> 5 For details, see http://sourceforge.net/projects/libb64
> 6 */
> 7
> 8 #ifndef BASE64_CDECODE_H
> 9 #define BASE64_CDECODE_H
> 10
> 11 typedef enum
> 12 {
> 13 step_a, step_b, step_c, step_d
> 14 } base64_decodestep;
> 15
> 16 typedef struct
> 17 {
> 18 base64_decodestep step;
> 19 char plainchar;
> 20 } base64_decodestate;
> 21
> 22 void base64_init_decodestate(base64_decodestate* state_in);
> 23
> 24 int base64_decode_value(char value_in);
> 25
> 26 int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in);
> 27
> 28 #endif /* BASE64_CDECODE_H */

Added include/s11n.net/c11n/detail/b64/cencode.h

Old () New (2c40267d4acdd10e)
> 1 /*
> 2 cencode.h - c header for a base64 encoding algorithm
> 3
> 4 This is part of the libb64 project, and has been placed in the public domain.
> 5 For details, see http://sourceforge.net/projects/libb64
> 6 */
> 7
> 8 #ifndef BASE64_CENCODE_H
> 9 #define BASE64_CENCODE_H
> 10
> 11 typedef enum
> 12 {
> 13 step_A, step_B, step_C
> 14 } base64_encodestep;
> 15
> 16 typedef struct
> 17 {
> 18 base64_encodestep step;
> 19 char result;
> 20 int stepcount;
> 21 } base64_encodestate;
> 22
> 23 void base64_init_encodestate(base64_encodestate* state_in);
> 24
> 25 char base64_encode_value(char value_in);
> 26
> 27 int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in);
> 28
> 29 int base64_encode_blockend(char* code_out, base64_encodestate* state_in);
> 30
> 31 #endif /* BASE64_CENCODE_H */
> 32

Added src/cdecode.c

Old () New (33dfb5c2cb7a09f6)
> 1 /*
> 2 cdecoder.c - c source to a base64 decoding algorithm implementation
> 3
> 4 This is part of the libb64 project, and has been placed in the public domain.
> 5 For details, see http://sourceforge.net/projects/libb64
> 6 */
> 7
> 8 #include <b64/cdecode.h>
> 9
> 10 int base64_decode_value(char value_in)
> 11 {
> 12 static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
> 13 static const char decoding_size = sizeof(decoding);
> 14 value_in -= 43;
> 15 if (value_in < 0 || value_in > decoding_size) return -1;
> 16 return decoding[(int)value_in];
> 17 }
> 18
> 19 void base64_init_decodestate(base64_decodestate* state_in)
> 20 {
> 21 state_in->step = step_a;
> 22 state_in->plainchar = 0;
> 23 }
> 24
> 25 int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in)
> 26 {
> 27 const char* codechar = code_in;
> 28 char* plainchar = plaintext_out;
> 29 char fragment;
> 30
> 31 *plainchar = state_in->plainchar;
> 32
> 33 switch (state_in->step)
> 34 {
> 35 while (1)
> 36 {
> 37 case step_a:
> 38 do {
> 39 if (codechar == code_in+length_in)
> 40 {
> 41 state_in->step = step_a;
> 42 state_in->plainchar = *plainchar;
> 43 return plainchar - plaintext_out;
> 44 }
> 45 fragment = (char)base64_decode_value(*codechar++);
> 46 } while (fragment < 0);
> 47 *plainchar = (fragment & 0x03f) << 2;
> 48 case step_b:
> 49 do {
> 50 if (codechar == code_in+length_in)
> 51 {
> 52 state_in->step = step_b;
> 53 state_in->plainchar = *plainchar;
> 54 return plainchar - plaintext_out;
> 55 }
> 56 fragment = (char)base64_decode_value(*codechar++);
> 57 } while (fragment < 0);
> 58 *plainchar++ |= (fragment & 0x030) >> 4;
> 59 *plainchar = (fragment & 0x00f) << 4;
> 60 case step_c:
> 61 do {
> 62 if (codechar == code_in+length_in)
> 63 {
> 64 state_in->step = step_c;
> 65 state_in->plainchar = *plainchar;
> 66 return plainchar - plaintext_out;
> 67 }
> 68 fragment = (char)base64_decode_value(*codechar++);
> 69 } while (fragment < 0);
> 70 *plainchar++ |= (fragment & 0x03c) >> 2;
> 71 *plainchar = (fragment & 0x003) << 6;
> 72 case step_d:
> 73 do {
> 74 if (codechar == code_in+length_in)
> 75 {
> 76 state_in->step = step_d;
> 77 state_in->plainchar = *plainchar;
> 78 return plainchar - plaintext_out;
> 79 }
> 80 fragment = (char)base64_decode_value(*codechar++);
> 81 } while (fragment < 0);
> 82 *plainchar++ |= (fragment & 0x03f);
> 83 }
> 84 }
> 85 /* control should not reach here */
> 86 return plainchar - plaintext_out;
> 87 }

Added src/cencode.c

Old () New (daf85ac49a712d98)
> 1 /*
> 2 cencoder.c - c source to a base64 encoding algorithm implementation
> 3
> 4 This is part of the libb64 project, and has been placed in the public domain.
> 5 For details, see http://sourceforge.net/projects/libb64
> 6 */
> 7
> 8 #include <b64/cencode.h>
> 9
> 10 const int CHARS_PER_LINE = 72;
> 11
> 12 void base64_init_encodestate(base64_encodestate* state_in)
> 13 {
> 14 state_in->step = step_A;
> 15 state_in->result = 0;
> 16 state_in->stepcount = 0;
> 17 }
> 18
> 19 char base64_encode_value(char value_in)
> 20 {
> 21 static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
> 22 if (value_in > 63) return '=';
> 23 return encoding[(int)value_in];
> 24 }
> 25
> 26 int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in)
> 27 {
> 28 const char* plainchar = plaintext_in;
> 29 const char* const plaintextend = plaintext_in + length_in;
> 30 char* codechar = code_out;
> 31 char result;
> 32 char fragment;
> 33
> 34 result = state_in->result;
> 35
> 36 switch (state_in->step)
> 37 {
> 38 while (1)
> 39 {
> 40 case step_A:
> 41 if (plainchar == plaintextend)
> 42 {
> 43 state_in->result = result;
> 44 state_in->step = step_A;
> 45 return codechar - code_out;
> 46 }
> 47 fragment = *plainchar++;
> 48 result = (fragment & 0x0fc) >> 2;
> 49 *codechar++ = base64_encode_value(result);
> 50 result = (fragment & 0x003) << 4;
> 51 case step_B:
> 52 if (plainchar == plaintextend)
> 53 {
> 54 state_in->result = result;
> 55 state_in->step = step_B;
> 56 return codechar - code_out;
> 57 }
> 58 fragment = *plainchar++;
> 59 result |= (fragment & 0x0f0) >> 4;
> 60 *codechar++ = base64_encode_value(result);
> 61 result = (fragment & 0x00f) << 2;
> 62 case step_C:
> 63 if (plainchar == plaintextend)
> 64 {
> 65 state_in->result = result;
> 66 state_in->step = step_C;
> 67 return codechar - code_out;
> 68 }
> 69 fragment = *plainchar++;
> 70 result |= (fragment & 0x0c0) >> 6;
> 71 *codechar++ = base64_encode_value(result);
> 72 result = (fragment & 0x03f) >> 0;
> 73 *codechar++ = base64_encode_value(result);
> 74
> 75 ++(state_in->stepcount);
> 76 if (state_in->stepcount == CHARS_PER_LINE/4)
> 77 {
> 78 *codechar++ = '\n';
> 79 state_in->stepcount = 0;
> 80 }
> 81 }
> 82 }
> 83 /* control should not reach here */
> 84 return codechar - code_out;
> 85 }
> 86
> 87 int base64_encode_blockend(char* code_out, base64_encodestate* state_in)
> 88 {
> 89 char* codechar = code_out;
> 90
> 91 switch (state_in->step)
> 92 {
> 93 case step_B:
> 94 *codechar++ = base64_encode_value(state_in->result);
> 95 *codechar++ = '=';
> 96 *codechar++ = '=';
> 97 break;
> 98 case step_C:
> 99 *codechar++ = base64_encode_value(state_in->result);
> 100 *codechar++ = '=';
> 101 break;
> 102 case step_A:
> 103 break;
> 104 }
> 105 *codechar++ = '\n';
> 106
> 107 return codechar - code_out;
> 108 }