#include <hallo.h>
* Eduard Bloch [Thu, Sep 29 2005, 12:42:58PM]:
> #include <hallo.h>
> * Manoj Srivastava [Wed, Aug 24 2005, 06:22:01PM]:
> >  be getting about 11MB/s, which should be enough for the use case
> >  mime-codecs was designed for.
> > 
> >         If you feel that we need faster tools, perhaps mime-codecs can
> >  be split out from VM and reimplemented in Perl.
> 
> Such comment is pointless and the performance did suck simply because of
> not doing any buffering at all. The patch (attached) solves the problem.
> If you can wait a bit, I will add buffering to -decode tool too.

Slightly changed version 2 attached (cosmetic fixes).

Eduard.
-- 
Nässe, Axel:
  Deologe, stellte fest, daß auch die Dicksten dünsten
--- vm-7.19.orig/base64-encode.c
+++ vm-7.19/base64-encode.c
@@ -7,6 +7,9 @@
  */
 
 #include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
 
 #ifdef _WIN32
 #ifndef WIN32
@@ -20,56 +23,68 @@
 #endif
 
 unsigned char alphabet[64] = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+#define BUFLEN 54*500 // multiple of 54 (a text line) fits best
 
 int
 main()
 {
-    int cols, bits, c, char_count;
-
 #ifdef WIN32
     _setmode( _fileno(stdin), _O_BINARY);
 #endif
 
-    char_count = 0;
-    bits = 0;
-    cols = 0;
-    while ((c = getchar()) != EOF) {
-       if (c > 255) {
-           fprintf(stderr, "encountered char > 255 (decimal %d)", c);
-           exit(1);
-       }
-       bits += c;
-       char_count++;
-       if (char_count == 3) {
-           putchar(alphabet[bits >> 18]);
-           putchar(alphabet[(bits >> 12) & 0x3f]);
-           putchar(alphabet[(bits >> 6) & 0x3f]);
-           putchar(alphabet[bits & 0x3f]);
-           cols += 4;
-           if (cols == 72) {
-               putchar('\n');
-               cols = 0;
-           }
-           bits = 0;
-           char_count = 0;
-       } else {
-           bits <<= 8;
-       }
-    }
-    if (char_count != 0) {
-       bits <<= 16 - (8 * char_count);
-       putchar(alphabet[bits >> 18]);
-       putchar(alphabet[(bits >> 12) & 0x3f]);
-       if (char_count == 1) {
-           putchar('=');
-           putchar('=');
-       } else {
-           putchar(alphabet[(bits >> 6) & 0x3f]);
-           putchar('=');
-       }
-       if (cols > 0)
-         putchar('\n');
-    }
+    char buf[BUFLEN];
+    char outbuf[4*BUFLEN]; // enough even for the case somebody is cheating, 
inserting single bytes
+    int len;
+    while(!feof(stdin)) {
+        int cols, bits, char_count;
+        unsigned char c;
+
+        char_count = 0;
+        bits = 0;
+        cols = 0;
+
+        char *out=outbuf;
+        int pos=0;
+        len=fread(buf, sizeof(char), BUFLEN, stdin);
+        if(!len) continue;
+
+        for(;pos<len;pos++) {
+            c=buf[pos];
+            bits += c;
+            char_count++;
+            if (char_count == 3) {
+                *out++ = (alphabet[bits >> 18]);
+                *out++ = (alphabet[(bits >> 12) & 0x3f]);
+                *out++ = (alphabet[(bits >> 6) & 0x3f]);
+                *out++ = (alphabet[bits & 0x3f]);
+                cols += 4;
+                if (cols == 72) {
+                    *out++ = '\n';
+                    cols = 0;
+                }
+                bits = 0;
+                char_count = 0;
+            } else {
+                bits <<= 8;
+            }
+        }
+        // handle the incomplete chunk
+        if (char_count != 0) {
+            bits <<= 16 - (8 * char_count);
+            *out++ = (alphabet[bits >> 18]);
+            *out++ = (alphabet[(bits >> 12) & 0x3f]);
+            if (char_count == 1) {
+                *out++ = '=';
+                *out++ = '=';
+            } else {
+                *out++ = (alphabet[(bits >> 6) & 0x3f]);
+                *out++ = '=';
+            }
+        }
+        if (cols > 0)
+            *out++ = '\n';
+        fwrite(outbuf, sizeof(char), (out-outbuf), stdout);
+     }
 
-    exit(0);
+    return 0;
 }

Reply via email to