2bf63ea350d003e918a60c30cbf769026f0d3fc9
[elisp/tm.git] / decode-b.c
1 /*
2  * $Id: decode-b.c,v 1.1 1994/07/22 06:22:43 morioka Exp morioka $
3  */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7
8 int get_base64_char_value(int chr)
9 {
10     if( ('A' <= chr) && (chr <= 'Z') ){
11         return chr - 'A';
12     }
13     else if( ('a' <= chr) && (chr <= 'z') ){
14         return chr - 'a' + 26;
15     }
16     else if( ('0' <= chr) && (chr <= '9') ){
17         return chr - '0' + 52;
18     }
19     else if(chr == '+'){
20         return 62;
21     }
22     else if(chr == '/'){
23         return 63;
24     }
25     return -1;
26 }
27
28 main()
29 {
30     FILE* rfp = stdin;
31     FILE* wfp = stdout;
32     char  str[128];
33     char* sp;
34     int   ret;
35     unsigned long int value;
36     unsigned char* buf = (void*)&value;
37     
38     while(fgets(str, 128, rfp)){
39         for(sp = str; *sp; ){
40             if( (*sp == '\r') || (*sp == '\n') ) break;
41             value  = get_base64_char_value(*sp++) * 64 * 64 * 64;
42             ret = get_base64_char_value(*sp++);
43             value += ret * 64 * 64;
44             ret = get_base64_char_value(*sp++);
45             if(ret >= 0){
46                 value += ret * 64;
47                 ret = get_base64_char_value(*sp++);
48                 if(ret >= 0){
49                     value += ret;
50                     fwrite(&buf[1], 1, 3, wfp);
51                 }
52                 else{
53                     fwrite(&buf[1], 1, 2, wfp);
54                     return 0;
55                 }
56             }
57             else{
58                 fwrite(&buf[1], 1, 1, wfp);
59                 return 0;
60             }
61         }
62     }
63     return 0;
64 }