annotate b64_de.c @ 0:01387a2e419e

initial version
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 07 Dec 2010 15:39:45 +0900
parents
children 972a7f233b23
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include <stdlib.h>
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #include <stdio.h>
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include <string.h>
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 struct tagTT
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 unsigned char buf;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 char *cont;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 int nlen;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 };
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 unsigned char CtoNum( int c );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 int GetNumB64( struct tagTT *pWork );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 int decode(char *cont, FILE *outfile)
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 unsigned int rw;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 struct tagTT work;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 work.buf = 0;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 work.nlen = 0;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 work.cont = cont;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 rw = GetNumB64( &work );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 while ( rw != -1 )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 putc( rw, outfile );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 rw = GetNumB64( &work );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 }
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 return 0;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 }
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 int GetNumB64( struct tagTT *pWork )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 int wr;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 unsigned char w;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 unsigned char r;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 wr = *pWork->cont;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 pWork->cont++;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 if ( wr == '\0' || wr == '=' )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 return -1;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 while(wr == '\n' || wr == '\t')
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 wr = *pWork->cont;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 pWork->cont++;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 }
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 w = CtoNum( wr );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 if ( pWork->nlen == 0 )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 unsigned char w2;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 wr = *pWork->cont;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 pWork->cont++;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 if ( wr != '\0' && wr != '=' )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 w2 = CtoNum( wr );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 else
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 w2 = 0;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 pWork->buf = w << 2;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 w = w2;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 pWork->nlen = 6;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 }
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 pWork->nlen -= 2;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 r = pWork->buf | ( w >> pWork->nlen );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 pWork->buf = ( w << ( 8 - pWork->nlen ) );
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 return r;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 }
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 unsigned char CtoNum( int c )
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 {
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 if ( c >= 'A' && c <= 'Z' ) return c - 'A';
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 if ( c >= 'a' && c <= 'z' ) return ( c - 'a' ) + 26;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 if ( c >= '0' && c <= '9' ) return ( c - '0' ) + 52;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 if ( c == '+' ) return 62;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 if ( c == '/' ) return 63;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 return -1;
01387a2e419e initial version
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 }