This commit was generated by cvs2svn to compensate for changes in r434,
[elisp/tm.git] / decode-b.c
index 2bf63ea..8eece33 100644 (file)
@@ -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 <kenji@reseau.toyonaka.osaka.jp>
+ *     based on Henry Spencer's un64 shell script
+ * 
  */
 
 #include <stdio.h>
@@ -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;
 }