/*
- * $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 <kenji@reseau.toyonaka.osaka.jp>
+ * based on Henry Spencer's un64 shell script
+ *
*/
#include <stdio.h>
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;
}