#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;
}