OSDN Git Service

addid library source 20140221
[zither/ds-zither.git] / sources / lib / libms / base64.c
1
2 #include<stdio.h>
3
4
5
6 int outchar(int * n, char ** ptr, char c);
7
8
9 /* base64 encode  */
10 int base64(char * data, int size, char * into)
11 {
12 char now[3];
13 char c;
14 int i, h, n;
15 char * ptr;
16 ptr = into;
17 n = 0;
18 for(i = 0; i < size; i += 3){
19    if(i + 2 < size){
20       now[0] = data[i];
21       now[1] = data[i + 1];
22       now[2] = data[i + 2];
23       c=(now[0]>>2)&0x3f;
24       outchar(&n, &ptr, c);
25       c=((now[0]<<4)&0x30) + ((now[1]>>4)&0x0f);
26       c&=0x3f;
27       outchar(&n, &ptr, c);
28       c=((now[1]<<2)&0x3c) + ((now[2]>>6)&0x03);
29       c&=0x3f;
30       outchar(&n, &ptr, c);
31       c=now[2]&0x3f;
32       c&=0x3f;
33       outchar(&n, &ptr, c);
34       }
35    else if(i + 1 < size){
36       now[0] = data[i];
37       now[1] = data[i + 1];
38       c=(now[0]>>2)&0x3f;
39       outchar(&n, &ptr, c);
40       c=((now[0]<<4)&0x30) + ((now[1]>>4)&0x0f);
41       c&=0x3f;
42       outchar(&n, &ptr, c);
43       c=((now[1]<<2)&0x3c);
44       c&=0x3f;
45       outchar(&n, &ptr, c);
46       }
47    else{
48       now[0] = data[i];
49       c=(now[0]>>2)&0x3f;
50       outchar(&n, &ptr, c);
51       c=((now[0]<<4)&0x30);
52       c&=0x3f;
53       outchar(&n, &ptr, c);
54       }
55    }
56
57 h = 4 - (n%4);
58 if(h != 4){
59    for(i = 0; i < h; i++){
60       *ptr = '=';
61       ptr++;
62       }
63    }
64
65 *ptr='\0';
66 return(0);
67 }
68
69
70
71
72
73
74
75 int outchar(int * n, char ** ptr, char c)
76 {
77
78 #ifdef BASE64_DEBUG
79 printf("%d ", c);
80 #endif
81
82 if(c <= 25){
83    **ptr = c+'A';
84    }
85 else if(c <= 51){
86    **ptr = c-26+'a';
87    }
88 else if(c <= 61){
89    **ptr = c-52+'0';
90    }
91
92 else if(c == 62){
93    **ptr = '+';
94    }
95
96 else if(c == 63){
97    **ptr = '/';
98    }
99 (*ptr)++;
100 (*n)++;
101
102 // if(cat > 0){
103 //   if((*n)%76 == 0){
104 //      **ptr = '\n';
105 //      (*ptr)++;
106 //      }
107 //   }
108
109 #ifdef BASE64_DEBUG
110 printf("%d ", **ptr);
111 printf("%c\n", **ptr);
112 #endif
113 return 0;
114 }              
115
116
117
118