X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=decode-b.c;h=8eece33e6ccca214283b74e1c5d6ad231cd2db77;hb=d26bc385edbd0d6d6abdcdaf7fb011296ff7eba8;hp=2bf63ea350d003e918a60c30cbf769026f0d3fc9;hpb=c8d67b7f628b6e02157bbee9018bcf0ef9b4f16d;p=elisp%2Ftm.git diff --git a/decode-b.c b/decode-b.c index 2bf63ea..8eece33 100644 --- a/decode-b.c +++ b/decode-b.c @@ -1,5 +1,9 @@ /* - * $Id: decode-b.c,v 1.1 1994/07/22 06:22:43 morioka Exp morioka $ + * $Id: decode-b.c,v 1.2 1995/02/04 02:51:53 morioka Exp $ + * + * modified by Kenji Rikitake + * based on Henry Spencer's un64 shell script + * */ #include @@ -32,33 +36,36 @@ main() char str[128]; char* sp; int ret; - unsigned long int value; - unsigned char* buf = (void*)&value; + unsigned int v1, v2, v3, v4, o1, o2, o3; - while(fgets(str, 128, rfp)){ - for(sp = str; *sp; ){ - if( (*sp == '\r') || (*sp == '\n') ) break; - value = get_base64_char_value(*sp++) * 64 * 64 * 64; - ret = get_base64_char_value(*sp++); - value += ret * 64 * 64; - ret = get_base64_char_value(*sp++); - if(ret >= 0){ - value += ret * 64; - ret = get_base64_char_value(*sp++); - if(ret >= 0){ - value += ret; - fwrite(&buf[1], 1, 3, wfp); - } - else{ - fwrite(&buf[1], 1, 2, wfp); + while (fgets(str, 128, rfp)) { + for (sp = str; *sp; ) { + if ((*sp == '\r') || (*sp == '\n')) break; + v1 = get_base64_char_value(*sp++); + v2 = get_base64_char_value(*sp++); + if (0 <= (v3 = get_base64_char_value(*sp++))) { + if (0 <= (v4 = get_base64_char_value(*sp++))) { + o1 = (v1 << 2) + (v2 >> 4); + o2 = ((v2 & 0x0f) << 4) + (v3 >> 2); + o3 = ((v3 & 0x03) << 6) + v4; + putc(o1, wfp); + putc(o2, wfp); + putc(o3, wfp); + } + else { + o1 = (v1 << 2) + (v2 >> 4); + o2 = ((v2 & 0x0f) << 4) + (v3 >> 2); + putc(o1, wfp); + putc(o2, wfp); return 0; + } } - } - else{ - fwrite(&buf[1], 1, 1, wfp); + else { + o1 = (v1 << 2) + (v2 >> 4); + putc(o1, wfp); return 0; + } } - } - } + } return 0; }