cmText.h/c : Added cmTextDecodeBase64().

This commit is contained in:
Kevin Larke 2015-07-31 08:20:39 -07:00
parent baca9cd48d
commit c5eaaf54b0
2 changed files with 233 additions and 1 deletions

209
cmText.c
View File

@ -1026,3 +1026,212 @@ cmChar_t* cmTextOutdent( cmChar_t* s, unsigned outdent )
return s; return s;
} }
unsigned cmTextDecodeBase64BufferByteCount( const char* xV, unsigned xN )
{
if( xN % 4 != 0 )
return cmInvalidCnt;
unsigned yN = xN / 4 * 3;
if( xV[xN-1] == '=' )
yN -= 1;
if( xV[xN-2] == '=' )
yN -= 2;
return yN;
}
cmTxRC_t cmTextDecodeBase64( const char* xV, unsigned xN, void* yV, unsigned yN )
{
int t[] =
{
64, // 0
64, // 1
64, // 2
64, // 3
64, // 4
64, // 5
64, // 6
64, // 7
64, // 8
64, // 9
64, // 10
64, // 11
64, // 12
64, // 13
64, // 14
64, // 15
64, // 16
64, // 17
64, // 18
64, // 19
64, // 20
64, // 21
64, // 22
64, // 23
64, // 24
64, // 25
64, // 26
64, // 27
64, // 28
64, // 29
64, // 30
64, // 31
64, // 32
64, // 33
64, // 34
64, // 35
64, // 36
64, // 37
64, // 38
64, // 39
64, // 40
64, // 41
64, // 42
62, // 43 +
64, // 44
64, // 45
64, // 46
63, // 47 /
52, // 48 0
53, // 49 1
54, // 50 2
55, // 51 3
56, // 52 4
57, // 53 5
58, // 54 6
59, // 55 7
60, // 56 8
61, // 57 9
64, // 58
64, // 59
64, // 60
64, // 61
64, // 62
64, // 63
64, // 64
0, // 65 A
1, // 66 B
2, // 67 C
3, // 68 D
4, // 69 E
5, // 70 F
6, // 71 G
7, // 72 H
8, // 73 I
9, // 74 J
10, // 75 K
11, // 76 L
12, // 77 M
13, // 78 N
14, // 79 O
15, // 80 P
16, // 81 Q
17, // 82 R
18, // 83 S
19, // 84 T
20, // 85 U
21, // 86 V
22, // 87 W
23, // 88 X
24, // 89 Y
25, // 90 Z
64, // 91
64, // 92
64, // 93
64, // 94
64, // 95
64, // 96
26, // 97 a
27, // 98 b
28, // 99 c
29, //100 d
30, //101 e
31, //102 f
32, //103 g
33, //104 h
34, //105 i
35, //106 j
36, //107 k
37, //108 l
38, //109 m
39, //110 n
40, //111 o
41, //112 p
42, //113 q
43, //114 r
44, //115 s
45, //116 t
46, //117 u
47, //118 v
48, //119 w
49, //120 x
50, //121 y
51, //122 z
64, //123
64, //124
64, //125
64, //126
64 //127
};
unsigned i = 0;
unsigned j = 0;
char* zV = (char*)yV;
while( i < xN )
{
unsigned yn = 3;
if( xV[i+3] == '=' )
--yn;
if( xV[i+2] == '=' )
--yn;
unsigned v = 0;
v += t[(int)xV[i++]] << 18;
v += t[(int)xV[i++]] << 12;
v += t[(int)xV[i++]] << 6;
v += t[(int)xV[i++]] << 0;
if( j >= yN )
break;
zV[j++] = (v & 0xff0000) >> 16;
if( yn > 1 )
{
if( j >= yN )
break;
zV[j++] = (v & 0x00ff00) >> 8;
}
if( yn > 2 )
{
if( j >= yN )
break;
zV[j++] = (v & 0x0000ff) >> 0;
}
}
return j;
}
unsigned cmTextEncodeBase64BufferByteCount( unsigned binByteCnt )
{
return 0;
}
cmTxRC_t cmTextEncodeBase64( const void* xV, unsigned xN, char* yV, unsigned yN )
{
// const char* t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
return kOkTxRC;
}

View File

@ -18,7 +18,8 @@ extern "C" {
kOkTxRC = 0, kOkTxRC = 0,
kNullTxRC, kNullTxRC,
kCvtErrTxRC, kCvtErrTxRC,
kLHeapFailTxRC kLHeapFailTxRC,
kBufTooSmallTxRC
}; };
typedef unsigned cmTxRC_t; typedef unsigned cmTxRC_t;
@ -273,6 +274,28 @@ extern "C" {
// then all leading white space is removed. // then all leading white space is removed.
cmChar_t* cmTextOutdent( cmChar_t* s, unsigned n ); cmChar_t* cmTextOutdent( cmChar_t* s, unsigned n );
// Given a string containing binary data encoded as base64
// return the size of the buffer required to hold the
// decoded binary data. Note that if xV[] is a legal base64
// string then xN must be a multiple of 4. If xN is not
// a mulitple of 4 then the function returns kInvalidCnt.
unsigned cmTextDecodeBase64BufferByteCount( const char* xV, unsigned xN );
// Decode the base64 data in xV[xN] into yV[yN]. Note that the
// minimum value of yN can be determined via
// cmTextDecodeBase64BufferByteCount().
// Return the actual count of bytes decoded into yV[].
unsigned cmTextDecodeBase64( const char* xV, unsigned xN, void* yV, unsigned yN );
// Given the count of bytes in a binary array, return
// the count of bytes required to store the array in base64.
unsigned cmTextEncodeBase64BufferByteCount( unsigned xN );
// Encode the binary array xV[xN] into yV[yN]. Note that the value
// of yN can be determined via cmTextEncodeBase64BufferByteCount().
cmTxRC_t cmTextEncodeBase64( const void* xV, unsigned xN, char* yV, unsigned yN );
//) //)
//} //}