tm 7.80.
[elisp/tm.git] / decode-b.c
1 /*
2  * $Id: decode-b.c,v 1.2 1995/02/04 02:51:53 morioka Exp $
3  *
4  * modified by Kenji Rikitake <kenji@reseau.toyonaka.osaka.jp>
5  *      based on Henry Spencer's un64 shell script
6  * 
7  */
8
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 int get_base64_char_value(int chr)
13 {
14     if( ('A' <= chr) && (chr <= 'Z') ){
15         return chr - 'A';
16     }
17     else if( ('a' <= chr) && (chr <= 'z') ){
18         return chr - 'a' + 26;
19     }
20     else if( ('0' <= chr) && (chr <= '9') ){
21         return chr - '0' + 52;
22     }
23     else if(chr == '+'){
24         return 62;
25     }
26     else if(chr == '/'){
27         return 63;
28     }
29     return -1;
30 }
31
32 main()
33 {
34     FILE* rfp = stdin;
35     FILE* wfp = stdout;
36     char  str[128];
37     char* sp;
38     int   ret;
39     unsigned int   v1, v2, v3, v4, o1, o2, o3;
40     
41     while (fgets(str, 128, rfp)) {
42         for (sp = str; *sp; ) {
43             if ((*sp == '\r') || (*sp == '\n')) break;
44             v1 = get_base64_char_value(*sp++);
45             v2 = get_base64_char_value(*sp++);
46             if (0 <= (v3 = get_base64_char_value(*sp++))) {
47                 if (0 <= (v4 = get_base64_char_value(*sp++))) {
48                     o1 = (v1 << 2) + (v2 >> 4);
49                     o2 = ((v2 & 0x0f) << 4) + (v3 >> 2);
50                     o3 = ((v3 & 0x03) << 6) + v4;
51                     putc(o1, wfp);
52                     putc(o2, wfp);
53                     putc(o3, wfp);
54                     }
55                 else {
56                     o1 = (v1 << 2) + (v2 >> 4);
57                     o2 = ((v2 & 0x0f) << 4) + (v3 >> 2);
58                     putc(o1, wfp);
59                     putc(o2, wfp);
60                     return 0;
61                     }
62                 }
63             else {
64                 o1 = (v1 << 2) + (v2 >> 4);
65                 putc(o1, wfp);
66                 return 0;
67                 }
68             }
69         }
70     return 0;
71 }