@@ -6,10 +6,11 @@ For details, see http://sourceforge.net/projects/libb64
6
6
*/
7
7
8
8
#include "cdecode.h"
9
+ #include <stdint.h>
9
10
10
- int base64_decode_value ( char value_in ){
11
- 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 };
12
- static const char decoding_size = sizeof (decoding );
11
+ static int base64_decode_value_signed ( int8_t value_in ){
12
+ static const int8_t 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 int8_t decoding_size = sizeof (decoding );
13
14
value_in -= 43 ;
14
15
if (value_in < 0 || value_in > decoding_size ) return -1 ;
15
16
return decoding [(int )value_in ];
@@ -20,10 +21,10 @@ void base64_init_decodestate(base64_decodestate* state_in){
20
21
state_in -> plainchar = 0 ;
21
22
}
22
23
23
- int base64_decode_block (const char * code_in , const int length_in , char * plaintext_out , base64_decodestate * state_in ){
24
- const char * codechar = code_in ;
25
- char * plainchar = plaintext_out ;
26
- char fragment ;
24
+ static int base64_decode_block_signed (const int8_t * code_in , const int length_in , int8_t * plaintext_out , base64_decodestate * state_in ){
25
+ const int8_t * codechar = code_in ;
26
+ int8_t * plainchar = plaintext_out ;
27
+ int8_t fragment ;
27
28
28
29
* plainchar = state_in -> plainchar ;
29
30
@@ -36,7 +37,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
36
37
state_in -> plainchar = * plainchar ;
37
38
return plainchar - plaintext_out ;
38
39
}
39
- fragment = (char ) base64_decode_value (* codechar ++ );
40
+ fragment = (int8_t ) base64_decode_value_signed (* codechar ++ );
40
41
} while (fragment < 0 );
41
42
* plainchar = (fragment & 0x03f ) << 2 ;
42
43
case step_b :
@@ -46,7 +47,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
46
47
state_in -> plainchar = * plainchar ;
47
48
return plainchar - plaintext_out ;
48
49
}
49
- fragment = (char ) base64_decode_value (* codechar ++ );
50
+ fragment = (int8_t ) base64_decode_value_signed (* codechar ++ );
50
51
} while (fragment < 0 );
51
52
* plainchar ++ |= (fragment & 0x030 ) >> 4 ;
52
53
* plainchar = (fragment & 0x00f ) << 4 ;
@@ -57,7 +58,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
57
58
state_in -> plainchar = * plainchar ;
58
59
return plainchar - plaintext_out ;
59
60
}
60
- fragment = (char ) base64_decode_value (* codechar ++ );
61
+ fragment = (int8_t ) base64_decode_value_signed (* codechar ++ );
61
62
} while (fragment < 0 );
62
63
* plainchar ++ |= (fragment & 0x03c ) >> 2 ;
63
64
* plainchar = (fragment & 0x003 ) << 6 ;
@@ -68,7 +69,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
68
69
state_in -> plainchar = * plainchar ;
69
70
return plainchar - plaintext_out ;
70
71
}
71
- fragment = (char ) base64_decode_value (* codechar ++ );
72
+ fragment = (int8_t ) base64_decode_value_signed (* codechar ++ );
72
73
} while (fragment < 0 );
73
74
* plainchar ++ |= (fragment & 0x03f );
74
75
}
@@ -77,10 +78,22 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
77
78
return plainchar - plaintext_out ;
78
79
}
79
80
80
- int base64_decode_chars (const char * code_in , const int length_in , char * plaintext_out ){
81
+ static int base64_decode_chars_signed (const int8_t * code_in , const int length_in , int8_t * plaintext_out ){
81
82
base64_decodestate _state ;
82
83
base64_init_decodestate (& _state );
83
- int len = base64_decode_block (code_in , length_in , plaintext_out , & _state );
84
+ int len = base64_decode_block_signed (code_in , length_in , plaintext_out , & _state );
84
85
if (len > 0 ) plaintext_out [len ] = 0 ;
85
86
return len ;
86
87
}
88
+
89
+ int base64_decode_value (char value_in ){
90
+ return base64_decode_value_signed (* ((int8_t * ) & value_in ));
91
+ }
92
+
93
+ int base64_decode_block (const char * code_in , const int length_in , char * plaintext_out , base64_decodestate * state_in ){
94
+ return base64_decode_block_signed ((int8_t * ) code_in , length_in , (int8_t * ) plaintext_out , state_in );
95
+ }
96
+
97
+ int base64_decode_chars (const char * code_in , const int length_in , char * plaintext_out ){
98
+ return base64_decode_chars_signed ((int8_t * ) code_in , length_in , (int8_t * ) plaintext_out );
99
+ }
0 commit comments