Mercurial > hg > Members > koba > t_dandy
diff b64_de.c @ 0:435ac1cdb64e
create task dandy directry.
author | koba <koba@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 11 Dec 2010 21:25:28 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/b64_de.c Sat Dec 11 21:25:28 2010 +0900 @@ -0,0 +1,84 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +struct tagTT +{ + unsigned char buf; + char *cont; + int nlen; +}; + +unsigned char CtoNum( int c ); +int GetNumB64( struct tagTT *pWork ); + +int decode(char *cont, FILE *outfile) +{ + int rw; + struct tagTT work; + + work.buf = 0; + work.nlen = 0; + work.cont = cont; + + rw = GetNumB64( &work ); + while ( rw != -1 ) + { + putc( rw, outfile ); + rw = GetNumB64( &work ); + } + return 0; +} + + +int GetNumB64( struct tagTT *pWork ) +{ + int wr; + unsigned char w; + unsigned char r; + + wr = *pWork->cont; + pWork->cont++; + if ( wr == '\0' || wr == '=' ) + return -1; + + while(wr == '\n' || wr == '\t') + { + wr = *pWork->cont; + pWork->cont++; + } + + w = CtoNum( wr ); + if ( pWork->nlen == 0 ) + { + unsigned char w2; + + wr = *pWork->cont; + pWork->cont++; + if ( wr != '\0' && wr != '=' ) + w2 = CtoNum( wr ); + else + w2 = 0; + + pWork->buf = w << 2; + w = w2; + pWork->nlen = 6; + } + + pWork->nlen -= 2; + + r = pWork->buf | ( w >> pWork->nlen ); + + pWork->buf = ( w << ( 8 - pWork->nlen ) ); + return r; +} + +unsigned char CtoNum( int c ) +{ + if ( c >= 'A' && c <= 'Z' ) return c - 'A'; + if ( c >= 'a' && c <= 'z' ) return ( c - 'a' ) + 26; + if ( c >= '0' && c <= '9' ) return ( c - '0' ) + 52; + if ( c == '+' ) return 62; + if ( c == '/' ) return 63; + return -1; +}